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

news2024/9/25 17:19:45

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1995906.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JavaEE初阶】JUC(java.uitl.concurrent)的常见类

&#x1f334;Callable 接口 之前讲到Runnable接口&#xff0c;用于描述一个任务&#xff0c;通过Runnable中的run方法来体现的&#xff0c;但是描述的任务没有返回值&#xff08;run方法是返回void&#xff09;&#xff0c;此处的Callable接口与Runnable接口类似&#xff0c;C…

LLVM理论篇之编译器前端

1、简述 LLVM前端通过对源程序的预处理&#xff0c;构成源程序的字符流扫描与分解&#xff0c;将单词序列提取为各类语法短语&#xff0c;生成抽象语法树&#xff0c;最终转换为中间代码。编译器前端包含的这几个过程如下&#xff1a; &#xff08;1&#xff09;预编译 &…

【python】实现对文件夹中的图像连续重命名方法

import os import shutildef rename_images(input_folder):# 获取输入文件夹下的所有图片文件&#xff08;假设都是.jpg格式&#xff09;image_files [f for f in os.listdir(input_folder) if os.path.isfile(os.path.join(input_folder, f)) and f.endswith(".jpg"…

性能测试工具LoadRunner

前言&#x1f440;~ 上一章我们介绍了性能测试的一些基本概念&#xff0c;重要的是性能测试的各项指标&#xff0c;今天我们使用性能测试工具LoadRunner简单的完成一次性能测试 性能测试Load Runner LoadRunner是什么&#xff1f; LoadRunner安装 LoadRunner脚本录制 1.录…

振弦式钢筋计的主要应用领域有哪些?

在现代工程建设中&#xff0c;钢筋作为重要的结构材料&#xff0c;其应力状态直接关系到工程结构的安全性和稳定性。因此&#xff0c;对钢筋应力的实时监测成为了保障工程质量的关键环节。振弦式钢筋计作为一种高精度、稳定性好的应力监测仪器&#xff0c;在桥梁、建筑、隧道等…

pg一些常用语句记录

查看数据库大小 pg_size_pretty:将数据库用量展示为KB、MB、GB等样式,查看更直观查看具体某个数据库的大小 select pg_size_pretty(pg_database_size(postgres)); 查看所有数据库的大小 select pg_database.datname, pg_size_pretty (pg_database_size(pg_database.datnam…

Sqli-labs-master靶场--布尔盲注

目录 1、布尔盲注 2、布尔盲注的流程&#xff08;以靶场less-8为例&#xff09; 2.1输入id尝试是否存在注入点 2.1.1通过以上尝试&#xff0c;联想到可能是布尔盲注 2.2猜测数据库长度 2.3获取数据库名 2.3.1python脚本获取 代码&#xff1a; 获取结果为&#xff1a; …

后期调色学习笔记

关于调色曲线的学习&#xff1a; 学习链接&#xff1a;一看就懂的曲线调色教程【手机摄影后期】_哔哩哔哩_bilibili 从左向右就是由暗部越来越到亮部 越靠近右侧的越是亮部

机械学习—零基础学习日志(数学基础汇总1)

零基础为了学人工智能&#xff0c;正在艰苦的学习 我比较推荐&#xff0c;《三个月从零入门深度学习&#xff0c;保姆级学习路线图》的整体学习思路&#xff0c;但因为数学基础太差&#xff0c;而且针对所需的数学系统知识&#xff0c;我依然没有很明确的学习方向。 所以直接…

杀手级的AI LLM产品还有多久面世

AI产品落地&#xff1a;Killer App依然缺席的原因与未来展望 &#x1f680; 在当今科技领域&#xff0c;人工智能&#xff08;AI&#xff09;无疑正处于一个快速发展的阶段。尽管如此&#xff0c;关于AI产品的实际应用和市场落地&#xff0c;仍然存在诸多挑战。本文将探讨当前…

使用 Matplotlib 绘制折线图

使用 Matplotlib 绘制折线图 数据可视化是数据分析的重要组成部分&#xff0c;通过图表&#xff0c;我们可以更直观地理解数据背后的趋势和模式。Matplotlib 是 Python 最基础也是最常用的绘图库之一&#xff0c;非常适合初学者。本文将带你从零开始&#xff0c;逐步创建和自定…

Python Static Typing: 提升代码可靠性与可读性的使用技巧

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…

Java毕业设计 基于SSM和Vue的酒店管理系统小程序

Java毕业设计 基于SSM和Vue的酒店管理系统小程序 这篇博文将介绍一个基于SSM框架和Vue开发的酒店管理系统微信小程序&#xff0c;适合用于Java毕业设计。 功能介绍 用户 登录 注册 忘记密码 首页 图片轮播 房间信息 房间详情 预订 收藏 评论 我的 订单信息 酒店管理…

Python 常用内置函数

目录 1、enumerate函数 1.1、for循环中使用 1.2、enumerate指定索引的起始值 1.3、enumerate在线程中的作用 2、Map 函数 2.1、map()函数可以传多个迭代器对象 3、lambda表达式&#xff08;匿名函数&#xff09; 示例 4、sort函数和sorted函数 4.1、sort()函数 4.2、…

vue2学习 -- vuex

文章目录 1. 理解2. 语法2.1 安装使用2.2 getters配置项2.3 四个map方法的使用2.4 vuex模块化 1. 理解 概念&#xff1a;专门在ue中实现集中式状态&#xff08;数据&#xff09;管理的一个ue插件&#xff0c;对vue应用中多个组件的共享状态进行集中式的管理&#xff08;读/写&…

Java基础 1. Java开发环境搭建

Java基础 1. Java开发环境搭建 文章目录 Java基础 1. Java开发环境搭建1.1. 常用的DOS命令1.1.1. 常用的Windows组合键:1.1.2. 常用的DOS命令:1.1.3. 批处理文件 1.2. 通用文本编辑快捷键1.2.1. Sublime Text文本编辑器的安装与使用安装中英文打开方式调整字体大小文件扩展名 1…

LlamaIndex 如何可视化跟踪日志

LlamaIndex 中无论是 RAG 还是 Agent&#xff0c;都是需要和 LLM 进行交互&#xff0c;在这个流程流中包括搜索、Retrieve和推理等多个阶段。提示词在整个流程通过模板进行控制&#xff0c;LlamaIndex 通过整合和调度完成最终任务。 大模型的一个最大特点就是无法保证回答百分…

假如有一个嵌套集合,怎么通过stream流将集合放到一个集合之中?

假如有一个嵌套集合&#xff0c;怎么通过stream流将集合放到一个集合之中&#xff1f; 问题解释&#xff1a;你有一个嵌套的集合&#xff0c;想要通过 Stream 流的方式将其中嵌套的集合放到一个新的集合中。可以使用 flatMap 方法来实现。这种方法非常适合处理嵌套集合的情况。…

2个方法教你如何删除ZIP压缩包密码

zip压缩包设置了加密密码&#xff0c;每次解压文件都需要输入密码才能够顺利解压出文件&#xff0c;当压缩包文件不再需要加密的时候&#xff0c;大家肯定想删除压缩包密码&#xff0c;或是忘记了压缩包密码&#xff0c;想要通过删除操作将压缩包密码删除&#xff0c;就能够顺利…

Basic Pentesting:2-打靶渗透【附代码】(权限提升)

靶机下载地址&#xff1a; https://www.vulnhub.com/entry/basic-pentesting-2,241/https://www.vulnhub.com/entry/basic-pentesting-2,241/ 1. 主机发现端口扫描目录扫描敏感信息获取 1.1. 主机发现 nmap -sn 192.168.7.0/24|grep -B 2 08:00:27:1D:4A:27 1.2. 端口扫描 …