前面给大家介绍完了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表示在按钮单击时执行的方法。