WPF篇(10)-Label标签+TextBlock文字块+TextBox文本框+RichTextBox富文本框
Label标签
Label控件继承于ContentControl控件,它是一个文本标签,如果您想修改它的标签内容,请设置Content属性。我们曾提过ContentControl的Content属性是object类型,意味着Label的Content也是可以设置为任意的引用类型的。
案例
前端代码
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center"><Label Content="这是一个Label标签"/><Label><Label.Content><Button Content="确定" Click="_Button1_Click"/></Label.Content></Label></StackPanel>
后端代码
public partial class MainWindow{public MainWindow(){InitializeComponent();}private void _Button1_Click(object sender, RoutedEventArgs e){this.Close();}}
我们给第二个标签的Content属性设置了一个按钮,并对按钮的Click事件做了订阅回调。此时的Button是可以正常使用 。只不过,通常情况下,我们的Label只是用来显示一段文字,很少在Contnet里面编写其它控件代码。如果要编写其它控件代码以实现更复杂的自定义控件效果,建议使用UserControl用户控件。
对于文本的显示,除了可以在Label中显示,还有一个控件也可以实现,那就是TextBlock文字块。而且,TextBlock控件直接从FrameworkElement基类继承而来,效率比Label标签更高。
TextBlock文字块
TextBlock是专业处理文本显示的控件,在功能上比Label更全面。
1. 属性说明
TextBlock提供了非常丰富的文本相关的属性。
- FontWeight :获取或设置TextBlock的字体粗细。
- FontStyle :获取或设置TextBlock的字体样式,如斜体字体。
- FontFamily :获取或设置TextBlock的字体系列,如微软雅黑。
- Text :获取或设置TextBlock的字体内容。
- ContentEnd :表示获取TextBlock内容的最末尾的TextPointer对象。
- Typography :获取此元素的内容当前有效的版式变体。
- FontStretch: 获取或设置 TextBlock 的常用字体拉伸特征。
- BaselineOffset :获取或设置文本的每个行相对于基线的偏移量。
- FontSize: 获取或设置TextBlock的字号。
- TextWrapping: 获取或设置TextBlock的文字的换行方式。
- Background: 获取或设置TextBlock控件的背景颜色(画刷)。
- TextEffects: 获取或设置要应用于此元素中的文本内容的效果。
- LineHeight: 获取或设置各行内容的高度。
- Padding :指示内容区域的边界之间填充空间的宽度。
- TextAlignment :指示文本内容的水平对齐方式。
- TextTrimming :获取或设置在内容超出内容区域时要采用的文本剪裁行为。
- Foreground :获取或设置文本内容的字体颜色(画刷)。
- Inlines :这个属性是一个集合,其中的元素表示内联流内容元素,简单点说,一行文本可以看成是一个Inline元素,而TextBlock可以接受多- 个Inline。Run继承于Inline,实际使用中,我们会创建多个Run实例,可以单独为每个Run对象设置字体字号颜色等等。
- ContentStart: 表示获取TextBlock内容的最开始的TextPointer对象。
2. 案例
<WrapPanel><TextBlock Text="这是一个TextBlock文字块" Margin="5"/><TextBlock Text="粗体文字" FontWeight="Bold" Margin="5"/><TextBlock Text="粗体文字" FontWeight="Light" Margin="5"/><TextBlock Text="斜体文字" FontStyle="Italic" Margin="5"/><TextBlock Text="微软雅黑" FontFamily="Microsoft YaHei UI" Margin="5"/><TextBlock Text="大号字体" FontSize="30" Margin="5"/><TextBlock Text="红色文字" Foreground="Red" Margin="5"/><TextBlock Text="底色文字" Foreground="Yellow" Background="Red" Margin="5"/><TextBlock Text="内间距文字" Foreground="Yellow" Background="Red" Padding="10" Margin="5"/><TextBlock Background="LightGray" Height="25"><Run Foreground="Red">这行文字</Run><Run Foreground="Green">由三部分</Run><Run Foreground="Blue">组成</Run></TextBlock><Grid Width="150" Height="100" Margin="5" Background="LightGoldenrodYellow"><TextBlock Text="这段文字体现了文字的文本换行属性TextWrapping" TextWrapping="Wrap" Margin="10"/></Grid><!--使用Run--><Grid><TextBlock x:Name="textblock" Width="320" Height="100" FontSize="15" FontFamily="微软雅黑" FontWeight="Black" FontStretch="Condensed" Foreground="#dddddd" Background="Teal" TextAlignment="Center" TextWrapping="Wrap" TextTrimming="CharacterEllipsis" Margin="10" Padding="5"HorizontalAlignment="Left" VerticalAlignment="Center" LineHeight="30" ToolTip="《临江仙·滚滚长江东逝水》"><Run Foreground="#CDB632" TextDecorations="Underline">滚滚长江东逝水,浪花淘尽英雄。是非成败转头空。青山依旧在,几度夕阳红。</Run><Run Text="白发渔樵江渚上,惯看秋月春风。一壶浊酒喜相逢。古今多少事,都付笑谈中。 "></Run></TextBlock></Grid></WrapPanel>
TextBlock大多数的属性应用都比较简单,容易理解。
Inlines属性是一个比较强大的属性,深入理解后,可以实现意想不到的效果。
TextEffects也是一个非常强大的属性,这需要掌握WPF的动画、触发器、关键帧等知识,才能实现文本的动画特效。我们将在学完动画后,再回头探讨这些内容。
TextBox文本框
几乎所有的文本、数字、符号的输入都是用TextBox文本框来完成的。TextBox用来获取用户的键盘输入的信息,这也是一个常用的控件。
它继承于TextBoxBase,而TextBoxBase又继承于Control。
1. TextBoxBase基类属性成员
- VerticalScrollBarVisibility: 垂直滚动条是否显示
- HorizontalScrollBarVisibility :水平滚动条是否显示
- AcceptsReturn :表示用户按下回车键时是否插入新行。
- AcceptsTab: 用来设置用户按下tab键的响应,为true表示插入一个制表符,否则将焦点移动到标记为制表位的下一个控件且不插入制表符。
- IsReadOnlyCaretVisible: 表示只读文本框是否显示插入符号,用得较少。
- SelectionOpacity :用来设置用户选中的文本的透明度。
- IsUndoEnabled: 表示文本编辑控件是否启用撤消支持。
- UndoLimit :获取或设置存储在撤消队列中的操作数目。
- AutoWordSelection :表示自动选择字词,默认为false。
- SelectionBrush :表示用户选择的文本段落的画笔,比较常用。
- IsReadOnly: 表示文本框是否只读,这个属性经常使用。
- CaretBrush :表示获取或设置用于绘制的文本框中插入符号的画笔。
- IsInactiveSelectionHighlightEnabled :表示获取或设置一个值,该值指示当文本框没有焦点时,文本框中是否显示选定的文本。
2. TextBoxBase基类事件成员
TextBoxBase基类提供了两个事件,分别是TextChanged和SelectionChanged。
-
TextChanged事件:只要文本框中的内容被修改,将会触发引事件,这通常用来做一些判断业务。比如某个文本框只能输入数字,那就可以去订阅TextChanged事件。
-
SelectionChanged事件:选中的文本框内容发生改变时引发的事件。
3. TextBox控件属性成员
- MinLines:获取或设置最小可见的行数。
- MaxLines:获取或设置可见行的最大数目。
- Text:获取或设置文本框的文本内容。
- CharacterCasing:获取或设置文本框字符的大小写形式,默认不转换。 它是一个枚举,Normal表示不转换大小写,Lower表示全部转换成小写,Upper表示全部转换成大写
- MaxLength:获取或设置最大可以在文本框中手动输入的字符数。
- TextAlignment:获取或设置文本框的内容的水平对齐方式。例如左对齐,右对齐,居在对齐和两端对齐。
- CaretIndex:获取或设置插入点移动的插入位置索引。
- SelectionLength:获取或设置一个值,该值在文本框中当前所选内容中的字符数。
- SelectionStart:获取或设置当前所选内容的起始位置的字符索引。
- Typography :获取文本框中的文本内容的当前有效的版式变体。
- LineCount :获取文本框中的总行数。
- TextDecorations :获取要应用于文本框中的文本修饰。
- SelectedText :获取或设置文本框中当前选择的内容。
- TextWrapping :获取或设置文本框中文本的换行方式。这个属性比较常用,在较长的文字段落显示时可以设置为Wrap,这样自动换行,界面呈现的效果比较令人满意。
TextBox文本框本身没有任务事件,都是继承父类的事件。
4. 案例
前端代码
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center"><TextBlock Text="用户名" Margin="5"/><TextBox x:Name="_textbox" Width="100" Height="25" MaxLength="10" CharacterCasing="Upper"/><Button x:Name="_button" Content="确定" Height="25" Margin="5 0" Click="_button_Click"/>
</StackPanel>
后端代码
public partial class MainWindow{public MainWindow(){InitializeComponent();}private void _button_Click(object sender, RoutedEventArgs e){MessageBox.Show($"您的用户名:{_textbox.Text}");}}
我们使用了CharacterCasing="Upper"这个设置,可以看到图片中的显示效果,虽然我在输入时是小写的china字符,但是,TextBox会转换成大写的CHINA,另外,总长度不能超过10个字符。
最后要获取TextBox文本框的内容,使用Text属性即可。当我们在学习了样式之后,我们还会回过头来,对TextBox控件进行深入学习。另外,TextBox还有一个控件,也是继承于TextBoxBase基类,它叫RichTextBox 类。这个控件的功能更加强大,能够对FlowDocument流文档进行操作。如果想开发类似Word的桌面软件,RichTextBox 和FlowDocument搭配组合是非常好的选择。
RichTextBox富文本框
RichTextBox继承于TextBoxBase基类,所以很大程度上与TextBox控件类似,两者在某些情况下可以互相替换。但是,如果要为用户提供更强大的文档编辑功能,非RichTextBox莫属。
RichTextBox控件有一个带参数的构造函数,参数的类型是FlowDocument类,另外,它还有一个Document属性,类型也是FlowDocument类,说明RichTextBox控件的元素必须且只能是FlowDocument类,如果试图将RichTextBox.Document=null,会发现它会报错。
案例
前端代码
<StackPanel><RichTextBox x:Name="_richTextBox" Margin="10 5" Height="270"><FlowDocument><Paragraph>RichTextBox富文本框控件到底有什么强大的功能?<Bold Foreground="DarkRed">请看下面.</Bold></Paragraph><Paragraph Foreground="Blue">RichTextBox唯一的子元素是FlowDocument</Paragraph><Paragraph Foreground="DarkGreen">FlowDocument是指流文档,一个流文档由一个或多个Block构成,所以它有一个Blocks属性。Block只是一个抽象基类,所以流文档的子元素其实是继承了Block的子类,例如:</Paragraph><List MarkerOffset="25" MarkerStyle="Decimal" StartIndex="1"><ListItem><Paragraph>BlockUIContainer(UI元素容器)</Paragraph></ListItem><ListItem><Paragraph>List(有序列表)</Paragraph></ListItem><ListItem><Paragraph>Paragraph(段落)</Paragraph></ListItem><ListItem><Paragraph>Section(分组)</Paragraph></ListItem><ListItem><Paragraph>Table(网格)</Paragraph></ListItem></List></FlowDocument></RichTextBox><Button x:Name="_button" Content="确定" Margin="10,5" Click="_button_Click"/></StackPanel>
后端代码
public partial class MainWindow{public MainWindow(){InitializeComponent();}private void _button_Click(object sender, RoutedEventArgs e){TextRange textRange = new TextRange(_richTextBox.Document.ContentStart, _richTextBox.Document.ContentEnd);MessageBox.Show(textRange.Text);Paragraph paragraph = new Paragraph();Run run = new Run($"当前时间:{DateTime.Now}"); //手动加换行run.Foreground = Brushes.Black;paragraph.Inlines.Add(run);_richTextBox.Document.Blocks.Add(paragraph);}}
如上所示,我们在窗体中实例化了一个RichTextBox控件,并实例化了一个FlowDocument对象。RichTextBox唯一的子元素是FlowDocument。
FlowDocument是指流文档,一个流文档由一个或多个Block构成,所以它有一个Blocks属性。Block只是一个抽象基类,FlowDocument流文档的子元素都继承了Block抽象基类,例如:
- BlockUIContainer(UI元素容器)
- List(有序列表)
- Paragraph(段落)
- Section(分组)
- Table(网格)
BlockUIContainer是一个非常强大的段落元素,因为它可以直接包含WPF的控件。这样一来,我们就可以将设计的UI写入到流文档中显示或打印。
上面这五个元素继承了TextElement、FrameworkContentElement和ContentElement三个父素,所以实际上这五个子元素就拥有了许多字体属性的设置、资源、样式、数据绑定、以及各种事件的应用。
如果要获取RichTextBox的文本信息,可以使用TextRange类。FlowDocument类有两个属性,分别ContentStart和ContentEnd,表示文字内容的开始和结束。
所以通过TextRange类的Text,我们就能访问到RichTextBox控件的内容。
相关文章:

WPF篇(10)-Label标签+TextBlock文字块+TextBox文本框+RichTextBox富文本框
Label标签 Label控件继承于ContentControl控件,它是一个文本标签,如果您想修改它的标签内容,请设置Content属性。我们曾提过ContentControl的Content属性是object类型,意味着Label的Content也是可以设置为任意的引用类型的。 案…...

JavaFX对话框控件-ChoiceDialog
JavaFX对话框控件-ChoiceDialog 常用属性titlecontentTextinitOwnergraphicheaderTextdefaultValuechoicesdialogPane 常用事件显示事件setOnShowing显示事件setOnShown弹框按钮点击 综合案例自定义下拉框内容 与Alert大部分功能类似按钮不可以自定义多一个下拉框 常用属性 …...

一文了解BTC中的二层协议中Nervos network,CKB,RGB++,UTXO stack 之间的关系
注:该内容不构成投资建议,有些内容摘抄其他地方,如侵权,请联系删除。 Nervos network Nervos Network 是一个开源的区块链生态项目,该项目提供一套解决方案来应对区块链扩展性和互操作性的问题。 Nervos Network 成立…...

Oracle(47)如何创建和使用集合?
在PL/SQL中,集合(Collection)是一种复合数据类型,用于存储一组相关的数据项。集合主要有三种类型:关联数组(Associative Arrays)、嵌套表(Nested Tables)和可变数组&…...

SpringIOC和SpringAOC
lombok插件 XML<!-- 加载资源文件 --><context:property-placeholder location"classpath:jdbc.properties"></context:property-placeholder><!-- 注入数据源 --><bean id"dataSource" class"com.mchange.v2.c3p0.ComboP…...

static关键字详解
文章目录 static使用示例static底层原理静态初始化顺序静态与线程安全 static static是Java中的一个关键字,用于定义类级别的成员,类级别的成员是指那些属于整个类,而不是特定对象实例的成员。在Java中,类级别的成员包括静态变量…...

使用 Java RestClient 与 Elasticsearch 进行索引管理的示例
文章目录 准备工作测试连接创建索引查询索引是否存在删除索引总结 在这篇博客中,我将和大家分享如何使用 Java RestClient 与 Elasticsearch 进行简单的索引管理操作。如果你在开发过程中需要对海量数据进行高效搜索和分析,Elasticsearch 可能是个不错的…...

编程-设计模式 10:外观模式
设计模式 10:外观模式 定义与目的 定义:外观模式(Facade Pattern)提供了一个统一的接口,用来访问子系统中的一群接口。它定义了一个高层接口,让子系统更容易使用。目的:简化复杂的子系统的使用…...

非范型ArrayList和泛型List<T>
ArrayList 是 C# 中的一个非泛型集合类,它属于 System.Collections 命名空间。它提供了动态数组的功能,允许你在运行时添加、删除和访问元素。然而,需要注意的是,ArrayList 并不是类型安全的,因为你可以向其中添加任何…...

魔众文库系统v7.0.0版本推荐店铺功能,管理菜单逻辑优化
推荐店铺功能,管理菜单逻辑优化 [新功能] RandomImageProvider 逻辑升级重构,支持更丰富的随机图片生成 [新功能] 资源篮订单参数字段 [新功能] 首页推荐店铺功能,需要在后台 文库系统 → 文库店铺 开启推荐 [系统优化] Grid 快捷编辑请求…...

03、流程控制语句
01、位运算符 一、位运算符:是针对二进制数据(补码)的运算。(0看成false,1看成true) &:按位与——求出两个数字对应的二进制,有0则0 | :按位或——求出两个数字对应的二进制,有1则1 ^ :按位异或 ——求出两个数字对应的二进制,…...

[Android] [解决]Bottom Navigation Views Activity工程带来的fragment底部遮盖的问题
创建了Bottom Navigation Views Activity之后,在fragment_home.xml,加了一个RecyclerView, 后来添加了item之后发现底部会被盖住一部分。 解决:在layout里面加两句: android:paddingBottom"?attr/actionBarSize&…...

Armv8/Armv9架构中的原子性
B2.2 Arm 架构中的原子性 原子性是内存访问的一个特性,描述为原子访问。Arm 架构描述涉及两种类型的原子性:单次复制原子性和多次复制原子性。在 Arm 架构中,内存访问的原子性要求取决于内存类型,以及访问是显式的还是隐式的。有关更多信息,请参见: 单次复制原子性的要求…...

读零信任网络:在不可信网络中构建安全系统15协议和过滤
1. 协议 1.1. IKE/IPSec 1.1.1. 因特网密钥交换协议(Internet Key Exchange,IKE)用于执行IPSec认证和密钥交换 1.1.1.1. 通常以后台守护进程的方式实现,使用预共享密钥或X.509证书来认证对端并创建一个安全会话 1.1.2. IKEv1与IKEv2 1.1.2.1…...

C语言学习笔记 Day11(指针--中2)
Day11 内容梳理: 目录 Chapter 7 指针 7.6 指针 & 函数 (1)形参改变实参的值 (2)字符数组作为函数参数 1)合并字符串 2)删掉字符串中空格 (3)指针作为函数返…...

Golang 并发编程
Golang 并发编程 Goroutine 什么是协程 创建 Goroutine 主 goroutine (main函数)退出后,其它的工作 goroutine 也会自动退出 package mainimport ("fmt""time" )func myFunc() {i : 0for {ifmt.Println("func: …...

【数据结构详解】——选择排序(动图详解)
目录 🕒 1. 直接选择排序🕒 2. 堆排序 🕒 1. 直接选择排序 💡 算法思想:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始(末尾)位置…...

杂项命令(笔记)
ifconfig :http://t.csdnimg.cn/gT2AR echo :http://t.csdnimg.cn/6DSoO ps和top的区别 http://t.csdnimg.cn/f1XWt...

代码随想录算法训练营Day38||完全背包问题、leetcode 518. 零钱兑换 II 、 377. 组合总和 Ⅳ 、70. 爬楼梯 (进阶)
一、完全背包问题 相较于01背包,完全背包的显著特征是每个物品可以用无数次,遍历顺序也不需要为了保证每个物品只去一次而倒序遍历。 #include<iostream> #include<vector> using namespace std; int main(){int N,V;cin>>N>>V…...

超越链端:Web3的无边界技术革命
Web3,作为互联网技术的第三代变革,正以其去中心化、开放透明的特性,重新定义着我们的数字生活。在这一背景下,“链端”概念逐渐成为热点,意味着我们不仅仅局限于区块链技术本身,而是探索其在更广泛领域的应…...

127. Go反射基本原理
文章目录 反射基础 - go 的 interface 是怎么存储的?iface 和 eface 的结构体定义(runtime/iface.go):_type 是什么?itab 是什么? 反射对象 - reflect.Type 和 reflect.Value反射三大定律Elem 方法reflect.…...

提高PDF电子书的分辨率
解决方法出处 1. 安装ImageMagick brew install imagemagick brew install ghostscript2. 按流程进行 convert -density 600 your_pdf_filename.pdf output-%02d.jpg convert output*.jpg -normalize -threshold 80% final-%02d.jpg convert final*.jpg my_new_highcontras…...

Spring Cloud全解析:注册中心之zookeeper注册中心
zookeeper注册中心 使用zookeeper作为注册中心就不需要像eureka一样,在写一个eureka-server的服务了,因为zookeeper本身就是一个服务端,只需要编写需要进行服务注册的客户端即可 依赖 <!-- zookeeper 注册中心 --> <dependency&g…...

解决戴尔台式电脑休眠后无法唤醒问题
近期发现有少量戴尔的台式机会有休眠后无法唤醒的问题,具体现象就是电脑在休眠后,电源指示灯以呼吸的频率闪烁,无论怎么点鼠标和键盘都没有反应,并且按开机按钮也没法唤醒,只能是长按开机键强制关机再重启才行…...

MySQL运维-分库分表
介绍 问题分析 拆分策略 垂直拆分 水平拆分 实现技术 Mycat概述 介绍 概念介绍 Mycat配置 schema.xml schema标签 schema标签(table) datanode标签 datahost标签 rule.xml sever.xml system标签 user标签 Mycat分片 分片规则-范围 分片规则-取模 分…...

AGX orin硬件设计
AGX orin简介 从硬件组成来说,AGX orin可以分为核心板和扩展板。 核心板 核心板就是英伟达原装板卡,如下图所示: 核心板分为32G内存版本和64内存版本,两个版本除去内存不同之外,CPU也略有差异。核心板通过…...

AI大模型开发——2.深度学习基础(1)
学习大模型开发之前,我们需要有足够的储备知识,类似于基础的python语法相信大家也都是十分熟悉了。所以笔者也是考虑了几天决定先给大家补充一些深度学习知识。 首先问大家一个问题,学习大模型之前为什么要先学习深度学习知识呢? …...

go语言day22 gin-vue-admin全栈项目的依赖安装
flipped-aurora/gin-vue-admin: 🚀ViteVue3Gin的开发基础平台,支持TS和JS混用。它集成了JWT鉴权、权限管理、动态路由、显隐可控组件、分页封装、多点登录拦截、资源权限、上传下载、代码生成器【可AI辅助】、表单生成器和可配置的导入导出等开发必备功能…...

PHP之docker学习笔记
Docker学习笔记 前言: 之前学过一遍忘了 那就再来一遍没啥好说的就是可以直接构建一个环境 然后方便部署官网 http://www.docker.com仓库 https://hub.docker.comDocker的基本组成 镜像 容器 仓库 安装与卸载 卸载 sudo yum remove docker \docker-client \dock…...

基于树莓派4B与STM32的UART串口通信实验(代码开源)
在现代嵌入式系统中,树莓派和STM32的结合使用已成为一种流行趋势,它们各自承担不同的角色,实现优势互补。树莓派以其强大的计算能力处理复杂算法,而STM32则以其高效的控制能力执行实际的硬件操作。本文将详细介绍如何实现基于树莓…...