WPF篇(7)- Control基类+ContentControl类(内容控件)+ButtonBase基类

前面给大家介绍完了WPF所有的布局控件,属性以及使用案例,从这里咱们就开始学下内容控件。

Control基类

Control是许多控件的基类。比如最常见的按钮(Button)、单选(RadioButton)、复选(CheckBox)、文本框(TextBox)、ListBox、DataGrid、日期控件等等。这些控件通常用于展示程序的数据或获取用户输入的数据,这一类型的控件称为内容控件或数据控件。

它们与前面的布局控件有一定的区别,布局控件更专注于界面,而内容控件更专注于数据(业务)。

1. 属性

Control类虽然可以实例化,但是在界面上是不会有任何显示的。只有那些继承了Control的子类(控件)才会在界面上显示,而且所呈现的样子各不相同,因为Control类提供了一个控件模板(ControlTemplate),而几乎所有的子类都对这个ControlTemplate进行了各自的实现,所以在呈现子类时,我们才会看到Button拥有Button的样子,TextBox拥有TextBox的样子。

  • FontStyle:获取或设置控件的字体结构,类似于Word中字体的常规、斜体或倾斜
  • FontStretch:获取或设置紧缩或在屏幕上展开一种字体的程度。
  • FontSize:获取或设置字体大小。
  • FontFamily:获取或设置控件的字体系列。如:微软雅黑 = "Microsoft YaHei UI"
  • Foreground:获取或设置控件的字体颜色,也就是所谓的前景色画笔,它是一个刷子(Brush)
  • Background:获取或设置一个用于描述控件的背景画笔。
  • BorderThickness:获取或设置控件的边框宽度。
  • IsTabStop:获取或设置一个值,该值指示控件是否包括在选项卡上的导航窗格中。
  • VerticalContentAlignment:获取或设置控件的内容的垂直对齐方式。
  • TabIndex:获取或设置一个值,确定当用户导航控件通过使用 TAB 键元素接收焦点的顺序。
  • Padding: 获取或设置在控件中的填充量。
  • Template:获取或设置控件模板。
  • FontWeight:获取或设置指定的字体粗细。
  • BorderBrush:获取或设置一个用于描述一个控件的边框背景画笔。
  • HorizontalContentAlignment:获取或设置控件的内容的水平对齐方式。

2. 事件

Control类还提供了两个事件,它们分别是PreviewMouseDoubleClick和MouseDoubleClick。

  • PreviewMouseDoubleClick:表示鼠标双击或多次单击时触发的事件。
  • MouseDoubleClick:表示鼠标双击或多次单击时触发的事件。

以Preview开头的事件叫隧道事件或预览事件,而MouseDoubleClick没有以Preview开头,所以它叫冒泡事件。

  • WPF的前端代码其实是一棵树,当我们在某个目标控件上进行鼠标操作时,所引发的事件有两个方向,一是从Winow根节点一直路由到目标控件上,看起来就好像是从外面一直沿着这棵树路由引发至里面,这就像我们开车进入隧道一样,所以Preview开头的事件叫隧道事件。

  • 冒泡事件事件的路由方向相反,是从目标控件位置开始,一直路由引发至最外层的Window窗体。

关于路由事件,后面我们会细聊。

ContentControl类(内容控件)

它有一个Content属性,这个属性的类型是object。本质上,它可以接收任意引用类型的实例。

但是通常情况下,Content属性接收UI控件。因为ContentControl控件最终会把Content属性里面的内容显示到界面上。

如果我们将非要把其它类型的对象(比如字符串)强行塞给Content属性,如下:

xml 复制代码
    <ContentControl Foreground="Red" FontSize="36" HorizontalAlignment="Center" VerticalAlignment="Center">
        我爱学习WPF
    </ContentControl>

最后我们发现,也能够正常显示。

ContentTemplate属性(内容模板)

这个属性表示获取或设置用来显示的内容的数据模板,如果没有设置数据模板,它将以默认的数据模板来显示这几个字。我们看下这个属性的用法,并简要说明其中的关系。

xml 复制代码
    <ContentControl Foreground="Red" FontSize="36" HorizontalAlignment="Center" VerticalAlignment="Center">
        <ContentControl.ContentTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding}" Foreground="Green" FontSize="16"/>
            </DataTemplate>
        </ContentControl.ContentTemplate>
        我爱WPF
    </ContentControl>

ContentControl类的ContentTemplate属性是DataTemplate类型,所以我们在xaml中实例化了一个DataTemplate(数据模板)对象,并在其中增加了一个TextBlock控件,将TextBlock控件的Text属性写成了Binding形式,并设置了字体颜色和大小。

最终呈现的效果上图所示,字体颜色为绿色,大小为16。虽然ContentControl也设置了字体颜色为红色,大小为36,但是已经失效了。

ButtonBase基类

ButtonBase是一个抽象类,所以,它不能被实例化。我们只能在它的子类中去使用它提供的一些属性、事件或方法成员。它只有一个事件,就是Click单击事件,毕竟鼠标双击事件在它的Control基类就有了嘛。另外,它还有一个非常厉害的Command属性,这个属性其实是一个接口,起什么作用呢?就是在单击按钮时,去执行这个Command属性所指定的一个具体命令。

这个Command命令是WPF命令系统里面的角色,也是WPF优于Winform的一个具体表现,Command命令也是MVVM模式中最重要的一环。

按钮的形式有如下:

  • Button:普通按钮
  • CheckBox: 复选框按钮
  • RadioButton: 单选框按钮
  • ToggleButton :是CheckBox、RadioButton的基类,表示可以切换状态
  • RepeatButton: 重复,表示从按下到弹出过程中重复引发Click事件
  • GridViewColumnHeader: 表示GridViewColumn 的列标题,其实它也是一个按钮
  • DataGridColumnHeader: 表示DataGrid 列标题,也是一个按钮
  • DataGridRowHeader: 表示DataGrid 行标题,也是一个按钮

1. ButtonBase的属性

  • CommandTarget:获取或设置要对其引发指定的命令的元素。
  • CommandParameter:获取或设置一个命令参数,这个参数是传递给Command 属性所指向的命令。
  • Command:获取或设置要在按此按钮时调用的命令。
  • IsPressed:获取当前按钮是否处于激活状态。
  • ClickMode:获取或设置按钮的单击模式
  • IsEnabledCore:获取的值 System.Windows.ContentElement.IsEnabled 属性。

2. ButtonBase方法

ButtonBase还提供了两个虚方法,分别是OnClick()和OnIsPressedChanged()。说明这两个方法也是可以重写的,OnClick表示在按钮单击时执行的方法。

相关推荐
Scout-leaf5 天前
WPF新手村教程(三)—— 路由事件
c#·wpf
西岸行者6 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意6 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码6 天前
嵌入式学习路线
学习
毛小茛7 天前
计算机系统概论——校验码
学习
babe小鑫7 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms7 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下7 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。7 天前
2026.2.25监控学习
学习
im_AMBER7 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode