当前位置: 首页 > news >正文

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属性,如下:

    <ContentControl Foreground="Red" FontSize="36" HorizontalAlignment="Center" VerticalAlignment="Center">我爱学习WPF</ContentControl>

在这里插入图片描述
最后我们发现,也能够正常显示。

ContentTemplate属性(内容模板)

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

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • docker搭建frp内网穿透
  • 微信小程序--详情实现日期选择期(年月日)
  • Go 语言中创建方法
  • 设计模式18-中介者模式
  • 速记Java八股文——Redis 篇
  • 人工智能|人工智能教育的发展现状及趋势
  • 乐凡三防平板:以科技之力,推动工作智能化升级
  • Java入门、进阶、强化、扩展、知识体系完善等知识点学习、性能优化、源码分析专栏分享
  • Java stream流支持多字段排序
  • 【力扣】746.使用最小花费爬楼梯
  • Mysql 脚本转换为drawio ER 脚本
  • 使用LaTeX分章节撰写文档
  • LVS集群实现四层负载均衡详解(以nat,dr模式为例)
  • 【SQL Server】端口安全配置:SQL Server的安全最佳实践与防火墙规则配置
  • 前端(五):前端工程化
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 0基础学习移动端适配
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • CAP 一致性协议及应用解析
  • Git 使用集
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • React 快速上手 - 07 前端路由 react-router
  • Unix命令
  • webpack4 一点通
  • 大数据与云计算学习:数据分析(二)
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 基于webpack 的 vue 多页架构
  • 数组的操作
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 浅谈sql中的in与not in,exists与not exists的区别
  • 组复制官方翻译九、Group Replication Technical Details
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • ​字​节​一​面​
  • #{}和${}的区别?
  • %check_box% in rails :coditions={:has_many , :through}
  • (1)(1.9) MSP (version 4.2)
  • (3)llvm ir转换过程
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (三)终结任务
  • (小白学Java)Java简介和基本配置
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .NET Micro Framework初体验
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件
  • .net对接阿里云CSB服务
  • @Autowired @Resource @Qualifier的区别
  • @Value获取值和@ConfigurationProperties获取值用法及比较(springboot)
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)
  • [023-2].第2节:SpringBoot中接收参数相关注解
  • [145] 二叉树的后序遍历 js