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表示在按钮单击时执行的方法。

相关推荐
IM_DALLA26 分钟前
【Verilog学习日常】—牛客网刷题—Verilog快速入门—VL16
学习·fpga开发
IM_DALLA27 分钟前
【Verilog学习日常】—牛客网刷题—Verilog快速入门—VL18
学习·fpga开发
完球了28 分钟前
【Day02-JS+Vue+Ajax】
javascript·vue.js·笔记·学习·ajax
怀九日39 分钟前
C++(学习)2024.9.19
开发语言·c++·学习·重构·对象·
△曉風殘月〆1 小时前
在WPF中保存控件内容为图片
wpf
白帽黑客cst1 小时前
网络安全(黑客技术) 最新三个月学习计划
网络·数据结构·windows·学习·安全·web安全·网络安全
RS&2 小时前
python学习笔记
笔记·python·学习
芝麻科技2 小时前
Wpf使用NLog将日志输出到LogViewer
wpf·prism
EterNity_TiMe_2 小时前
【Linux基础IO】深入Linux文件描述符与重定向:解锁高效IO操作的秘密
linux·运维·服务器·学习·性能优化·学习方法
好家伙VCC3 小时前
STM32与51单片机的区别:是否应该直接学习STM32?
stm32·学习·51单片机