• 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唯一的子元素是FlowDocumentParagraph>
                    <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控件的内容。

  • 相关阅读:
    计算机毕业设计SSM仓库物资信息可视化管理系统【附源码数据库】
    广西(柳州)创建国家级车联网先导区建设方案
    python之 pyCharm pip安装pandas库失败
    win10实现nfs文件共享II
    在浏览器输入url到页面展示出来
    sql刷题积累的知识点
    HighCharts点击无响应问题
    目标检测——day45 基于水平边界框上滑动顶点的多朝向目标检测
    MySQL数据库管理(二)
    【300+精选大厂面试题持续分享】大数据运维尖刀面试题专栏(十二)
  • 原文地址:https://blog.csdn.net/wu2374633583/article/details/140957931