WPF篇(10)-Label标签+TextBlock文字块+TextBox文本框+RichTextBox富文本框

news2024/11/24 14:28:13

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控件的内容。

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

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

相关文章

学习笔记 韩顺平 零基础30天学会Java(2024.8.8)

P492 第三代日期使用 P493 第三代日期方法 P495 String翻转 作业代码见chapter12homework 对于需要异常处理的情况&#xff0c;可以通过这种想法得到&#xff1a; P495 注册处理题 P496 字符串统计 P497 String内存布局测试题 P498 常见类阶段梳理 P499 集合介绍 集合的使用并不…

xxljob--入门使用

1.简介 XXL-JOB是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&#xff0c;开箱即用。 2.下载 网址&#xff1a;xxljob 3. 导入数据库 3.1请下载项目源码并解压&#xff0c;获取 “调…

ElasticSearch(九)— 聚集查询2

一、 范围分桶聚集 如果使用 SQL 语言类比&#xff0c;桶型聚集与 SQL 语句中的 group by 子句极为相似。桶型聚集(Bucket Aggregation)是 Elasticsearch 官方对这种聚集的叫法&#xff0c;它起的作用是根据条件对文档进行分组。 可以将这里的桶理解为分组的容器&#xff0c;…

git commit 提交报错

当使用git cimmit -m "XXX" 将暂存区文件提交到仓库区时出现以下错误信息&#xff1a; 原因&#xff1a;开启了 eslint 校验 只要跳过 eslint 校验就可以了&#xff0c;即加 --no-verify 即可解决 git commit --no-verify -m "XXX"

太极图形学——弹性物体仿真 1

1.仿真基础&#xff0c;时间和空间的离散化 渲染对于物体的展现来说是一件很重要的事 但除了渲染之外&#xff0c;还需要物理来控制&#xff0c;形成动画 弹性物体的仿真实际上非常重要&#xff0c;特别是对于头发&#xff0c;衣物的仿真&#xff0c;虚拟手术中软组织的仿真 仿…

JupyterNotebook添加Anaconda中已有的虚拟环境

比如&#xff0c;在Acaconde中存在一个我已经配置好的虚拟环境pose,现在我想在Jupyter中使用它 那么可以使用ipython kernel install --user --name 你要添加的环境 添加到Jupyter中。 对于Jupyter中已有的代码&#xff0c;就可以在Kernel - chanage kernel中改变内核。

大模型+XDR!打开网络安全攻防演练新范式!

网络安全领域面临着日益复杂的挑战&#xff0c;外部攻击与内部安全威胁交织的双重压力。技术革新成为筑牢安全防线的关键&#xff0c;随着新一代技术的崛起&#xff0c;特别是大数据与人工智能的深度融合&#xff0c;引领着网络安全进入全新阶段。 通过构建网络安全大模型&…

批量重命名图片文件名,这几种方法告别手打!

在这个数字化时代&#xff0c;图片已成为我们日常生活和工作中不可或缺的一部分。无论是整理旅行照片、管理项目素材&#xff0c;还是编辑文章配图&#xff0c;图片的管理都显得尤为重要。然而&#xff0c;面对成百上千的图片文件&#xff0c;如果还在逐一手动修改文件名&#…

OpenSNN推文:研究发现,人工智能以牺牲集体多样性为代价提升个人创造力

&#xfeff;&#xfeff; ChatGPT 等生成式 AI 工具的兴起引发了关于它们对创造力和新颖想法产生的影响的争论。 伦敦大学管理学院和埃克塞特大学研究人员开展的一项新研究探索了生成模型对创意写作的影响。该研究考察了获取大型语言模型 (LLM) 生成的故事创意如何影响人类创…

使用 Python 执行 JavaScript

案例引入 网站&#xff1a; https://spa7.scrape.center 这里是一个简单的 NBA 球星的网站&#xff0c; 用卡片形式展示了一些球星的基本信息。另外&#xff0c;每张卡片其实都有一个加密字符串&#xff0c;这个加密字符串其实和球星的信息是由关联的&#xff0c; 并且每个球星…

数据库范式及其示例,看完这一篇足够

1. 什么是数据库规范化&#xff1f; 1.1 规范化概念 规范化是一种数据库设计技术&#xff0c;可减少数据冗余并消除插入、更新和删除异常等不良特征。规范化规则将较大的表划分为较小的表并使用关系链接它们。SQL 中的规范化的目的是消除冗余&#xff08;重复&#xff09;数据…

Java面试题:Spring循环引用(循环依赖)

Spring中的循环引用 在创建A时需要B,创建B时需要A 三级缓存解决循环依赖问题 在Spring中定义了一个类 DefaultSingletonBeanRegistry 中定义了三个map singletonObjects 一级缓存 单例池,存放完整初始化的bean对象 earlySingletonObjects 二级缓存 缓存早期的bean对象…

【JavaEE初阶】CAS(比较和交换)

目录 &#x1f332; 什么是 CAS &#x1f333; CAS的应用 &#x1f6a9; 实现原子类 &#x1f6a9; 实现自旋锁 &#x1f384; CAS 的 ABA 问题 &#x1f6a9; 什么是 ABA 问题 &#x1f6a9; ABA 问题引来的 BUG &#x1f6a9; 解决方案 &#x1f340;CAS相关面试题 …

自动化测试客户端程序 时,选择使用什么自动化测试工具?

自动化测试客户端程序时&#xff0c;可以选择多种自动化测试工具&#xff0c;这些工具根据测试的具体需求、目标平台以及开发语言等因素有所不同。以下是一些常用的自动化测试工具&#xff0c;它们分别适用于不同的测试场景&#xff1a; 1. Appium 简介&#xff1a;Appium是一…

你要动态建表,还要动态导入Excel?

背景 ⭐⭐⭐⭐⭐转载请注明出处:https://juejin.cn/post/7400945359192866828 前几天和公司的小伙伴聊天的时候,得知他们的项目里正要做一个功能。大概就是每家公司都会建一张表,这张表会有什么字段不确定,可能有的表10个字段,有的8个字段。然后会有导入的功能,就是给这张…

java实现解析pdf格式发票

为了减少用户工作量及误操作的可能性&#xff0c;需要实现用户上传PDF格式的发票&#xff0c;系统通过解析PDF文件获取发票内容&#xff0c;并直接将其写入表单。以下文章记录了功能实现的代码。 发票样式 发票内容解析 引用Maven 使用pdfbox <dependency><groupI…

API可观察性对于现代应用程序的最大好处

API可观察性是提升性能、加速问题诊断和增强安全的关键。它在理解和管理错综复杂的API交互方面发挥着至关重要的作用。利用API可观察性&#xff0c;您可以深入洞察API的工作状态&#xff0c;保障服务的可靠性&#xff0c;并优化用户体验。 在当今的数字环境中&#xff0c;API …

kubernetes集群部署sql server数据库服务

背景&#xff1a; 因业务上线需要&#xff0c;研发中心要求在kubernetes测试集群部署一个sql server 2017的数据库&#xff0c;用于业务功能调试。 一、实施部署sql server数据库&#xff1a; 1、拉取sql server 2017的镜像&#xff1a; [rootharbor-02 ~]# docker pull mcr…

POI导出复杂Excel表格

记录在遇到复杂统计报表业务时&#xff0c;无法使用Excel模板生成对应报表&#xff0c;则采用最原始poi方式进行创建生成 业务所需统计报表如下图 麻烦所在各类型订单下方餐别为动态数据&#xff0c;废话不多说直接上代码 new CellRangeAddress(起始行号, 终止行号, 起始列号,…

Android Studio 设置打开layout.xml文件的默认视图split

Android Studio 设置打开layout.xml文件的默认视图 Android Studio 设置打开layout.xml文件的默认视图 androd studio 在使用的时候打开我们自己的布局文件默认展示的视图为Design,我们想要编辑的时候还有手动切换成splite 视图或者Code视图&#xff0c;不上很方便&#xff0c…