文本控件(Text Controls)

WPF 的文本控件是专门用于显示、编辑、格式化文本的核心控件,按 “只读展示” 和 “可编辑输入” 分为两大类,覆盖从简单文本展示到富文本编辑的全场景。下面逐个讲解最常用的文本控件,包含核心特性、实战用法和最佳实践。

一、TextBlock(轻量级文本展示控件) 

核心特性

  • 只读、轻量级、高性能(WPF 中最常用的文本展示控件);
  • 支持行内格式化(不同字体 / 颜色 / 大小)、换行、文本溢出处理;
  • 无 ContentTemplate 等额外开销,比 Label 更高效;
  • 核心属性:TextFontSizeForegroundTextWrappingTextTrimming

实战用法

1. 基础文本展示

 1 <!-- 最简用法 -->
 2 <TextBlock Text="Hello WPF" Margin="5"/>
 3 
 4 <!-- 带样式的基础文本 -->
 5 <TextBlock 
 6     Text="WPF文本控件详解"
 7     FontSize="18"
 8     FontWeight="Bold"
 9     Foreground="#0078D7"  <!-- 微软蓝 -->
10     Margin="5"/>

2. 文本换行与溢出处理(高频场景)

1 <!-- 自动换行 + 溢出省略号 -->
2 <TextBlock 
3     Text="这是一段超长的文本,用于演示TextBlock的换行和溢出处理特性,当文本超出控件宽度时会自动换行,若禁用换行则显示省略号。"
4     Width="200"
5     TextWrapping="Wrap"  <!-- Wrap=自动换行,NoWrap=不换行 -->
6     TextTrimming="CharacterEllipsis"  <!-- 溢出显示省略号:CharacterEllipsis(字符)/WordEllipsis(单词) -->
7     Margin="5"/>

3. 行内混合样式(核心优势)

1 <!-- 同一行文本不同样式 -->
2 <TextBlock Margin="5">
3     <Run Text="WPF" FontSize="16" FontWeight="Bold" Foreground="Red"/>
4     <Run Text="文本控件" FontSize="14"/>
5     <Run Text="(TextBlock)" FontStyle="Italic" Foreground="Gray"/>
6 </TextBlock>

4. 绑定数据 + 格式化

1 // ViewModel中的数据
2 public decimal Price { get; set; } = 2999.99m;
3 public DateTime CreateTime { get; set; } = DateTime.Now;
1 <!-- 绑定并格式化文本 -->
2 <TextBlock 
3     Text="{Binding Price, StringFormat='商品价格:¥{0:F2}'}"
4     Margin="5"/>
5 
6 <TextBlock 
7     Text="{Binding CreateTime, StringFormat='创建时间:yyyy-MM-dd HH:mm:ss'}"
8     Margin="5"/>

最佳实践

  • 纯文本展示优先用 TextBlock,而非 Label(Label 有 Target 关联等额外开销);
  • 大量文本展示时,设置TextWrapping="Wrap"避免横向溢出;
  • 短文本(如按钮文字)直接用 TextBlock,无需嵌套其他控件。

二、Label(带关联功能的文本标签)

核心特性

  • 继承自 ContentControl,支持 Content(可放非文本内容);
  • 核心优势:Target属性关联输入控件(点击 Label 聚焦目标)、支持访问键(Alt + 快捷键);
  • 适合表单标签,功能比 TextBlock 多,但性能稍差。

实战用法

1. 关联输入控件(核心场景)

 1 <Grid Width="300" Margin="5" ColumnDefinitions="80,*">
 2     <!-- Label关联TextBox,点击Label聚焦TextBox -->
 3     <Label 
 4         Grid.Column="0"
 5         Content="_用户名:"  <!-- 访问键:Alt+U -->
 6         Target="{Binding ElementName=txtUserName}"
 7         HorizontalAlignment="Right"
 8         VerticalAlignment="Center"/>
 9     
10     <TextBox 
11         x:Name="txtUserName"
12         Grid.Column="1"
13         Margin="5 0 0 0"
14         PlaceholderText="请输入用户名"/>
15 </Grid>

2. 带图标 / 复杂内容的 Label

1 <!-- Label的Content可以是任意UI元素 -->
2 <Label Margin="5">
3     <StackPanel Orientation="Horizontal">
4         <materialDesign:PackIcon Kind="Warning" Width="16" Height="16" Foreground="Orange"/>
5         <TextBlock Text="警告:密码长度不足" Margin="5 0 0 0"/>
6     </StackPanel>
7 </Label>

最佳实践

  • 仅在表单标签需要关联输入控件时用 Label,其他场景用 TextBlock;
  • 访问键命名规范:_用户名(Alt+U)、_密码(Alt+P),提升易用性。

三、TextBox(单行文本输入控件)

核心特性

  • 单行 / 多行文本输入,支持占位符、密码框、文本选择;
  • 核心属性:TextIsReadOnlyIsEnabledPlaceholderTextMaxLengthAcceptsReturn(是否允许多行);
  • 支持文本变更事件(TextChanged)、绑定更新(UpdateSourceTrigger)。

实战用法

1. 基础单行输入(表单常用)

 1 <!-- 普通单行输入 -->
 2 <TextBox 
 3     Width="200"
 4     Margin="5"
 5     PlaceholderText="请输入手机号"  <!-- 占位提示文本 -->
 6     MaxLength="11"  <!-- 最大长度 -->
 7     TextChanged="TxtPhone_TextChanged"/>  <!-- 文本变更事件 -->
 8 
 9 <!-- 密码输入框 -->
10 <TextBox 
11     Width="200"
12     Margin="5"
13     PlaceholderText="请输入密码"
14     PasswordChar="*"/>  <!-- 密码掩码 -->

2. 多行文本输入(替代 TextBox)

1 <!-- 多行输入:开启换行 + 滚动条 -->
2 <TextBox 
3     Width="200"
4     Height="100"
5     Margin="5"
6     AcceptsReturn="True"  <!-- 允许回车换行 -->
7     TextWrapping="Wrap"
8     VerticalScrollBarVisibility="Auto"/>  <!-- 自动显示垂直滚动条 -->

3. 绑定输入(MVVM 场景)

1 <!-- 绑定并设置更新触发方式(失去焦点/实时更新) -->
2 <TextBox 
3     Width="200"
4     Margin="5"
5     Text="{Binding UserName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
6 <!-- UpdateSourceTrigger:PropertyChanged(实时更新)/LostFocus(失去焦点更新) -->

最佳实践

  • 单行短文本输入用 TextBox,多行大文本优先用RichTextBox
  • 密码输入推荐用PasswordBox(更安全,TextBox 的 PasswordChar 易被破解);
  • 表单输入绑定建议用UpdateSourceTrigger=LostFocus,减少频繁更新 ViewModel。

四、PasswordBox(安全密码输入控件)

核心特性

  • 专门用于密码输入,比 TextBox 更安全(密码不存储在 Text 属性,避免内存泄露);
  • 核心属性:Password(密码字符串)、PasswordChar(掩码字符)、IsPasswordRevealButtonEnabled(显示 / 隐藏密码按钮);
  • 注意:Password属性不支持绑定(安全设计),需通过事件 / 附加属性实现绑定。

实战用法

1. 基础密码输入

1 <!-- 带显示密码按钮的密码框 -->
2 <PasswordBox 
3     Width="200"
4     Margin="5"
5     PasswordChar=""
6     IsPasswordRevealButtonEnabled="True"  <!-- 显示眼睛图标,点击切换可见性 -->
7     PasswordChanged="PwdBox_PasswordChanged"/>  <!-- 密码变更事件 -->

2. MVVM 绑定(附加属性实现)

 1 // 自定义附加属性(解决Password不支持绑定的问题)
 2 public static class PasswordBoxHelper
 3 {
 4     public static readonly DependencyProperty BoundPasswordProperty =
 5         DependencyProperty.RegisterAttached(
 6             "BoundPassword", 
 7             typeof(string), 
 8             typeof(PasswordBoxHelper),
 9             new PropertyMetadata(string.Empty, OnBoundPasswordChanged));
10 
11     public static string GetBoundPassword(DependencyObject d) => (string)d.GetValue(BoundPasswordProperty);
12     public static void SetBoundPassword(DependencyObject d, string value) => d.SetValue(BoundPasswordProperty, value);
13 
14     private static void OnBoundPasswordChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
15     {
16         if (d is PasswordBox pb)
17         {
18             pb.PasswordChanged -= PasswordChanged;
19             if (e.NewValue != null)
20             {
21                 pb.Password = e.NewValue.ToString();
22             }
23             pb.PasswordChanged += PasswordChanged;
24         }
25     }
26 
27     private static void PasswordChanged(object sender, RoutedEventArgs e)
28     {
29         if (sender is PasswordBox pb)
30         {
31             SetBoundPassword(pb, pb.Password);
32         }
33     }
34 }
1 <!-- 使用附加属性绑定密码 -->
2 <PasswordBox 
3     Width="200"
4     Margin="5"
5     local:PasswordBoxHelper.BoundPassword="{Binding Password, Mode=TwoWay}"/>

最佳实践

  • 密码输入必须用 PasswordBox,禁止用 TextBox 的 PasswordChar;
  • 避免在日志 / 调试中输出 Password 属性,防止密码泄露;
  • 生产环境建议开启IsPasswordRevealButtonEnabled,提升用户体验。

五、RichTextBox(富文本编辑控件)

核心特性

  • 支持格式化文本编辑(字体、颜色、大小、段落、图片、超链接);
  • 基于 FlowDocument,可加载 / 保存 XAML/RTF 格式文本;
  • 适合富文本编辑器、邮件编辑、文档编辑场景。

实战用法

1. 基础富文本编辑

 1 <!-- 简单富文本编辑器 -->
 2 <RichTextBox 
 3     Width="300"
 4     Height="200"
 5     Margin="5">
 6     <!-- 初始富文本内容 -->
 7     <FlowDocument>
 8         <Paragraph FontSize="14">
 9             <Run Text="WPF富文本编辑示例" FontWeight="Bold" Foreground="Blue"/>
10             <LineBreak/>  <!-- 换行 -->
11             <Run Text="支持不同样式的文本、图片、超链接等"/>
12             <Hyperlink NavigateUri="https://learn.microsoft.com/zh-cn/dotnet/desktop/wpf/controls/richtextbox?view=netdesktop-8.0" TextDecorations="Underline">
13                 查看官方文档
14             </Hyperlink>
15         </Paragraph>
16     </FlowDocument>
17 </RichTextBox>

2. 代码操作富文本

 1 // 向RichTextBox添加格式化文本
 2 private void BtnAddText_Click(object sender, RoutedEventArgs e)
 3 {
 4     var richTextBox = (RichTextBox)sender;
 5     var paragraph = new Paragraph();
 6     
 7     // 添加红色粗体文本
 8     var run = new Run("动态添加的富文本");
 9     run.FontWeight = FontWeights.Bold;
10     run.Foreground = Brushes.Red;
11     paragraph.Inlines.Add(run);
12     
13     // 添加到文档
14     richTextBox.Document.Blocks.Add(paragraph);
15 }

最佳实践

  • 仅在需要富文本编辑时用 RichTextBox,普通多行文本用 TextBox(更轻量);
  • 保存富文本建议用 XAML 格式(richTextBox.Document.Save()),兼容性更好;
  • 避免在 RichTextBox 中加载超大文档,会导致性能下降。

六、TextBlock vs Label vs TextBox 核心区别(必记)

控件核心用途性能关键特性适用场景
TextBlock 纯文本展示 最高 轻量、行内样式、文本溢出处理 界面文本、提示、数据展示
Label 表单标签(关联输入控件) 中等 Target 关联、访问键、支持 Content 表单标签、带关联的文本
TextBox 文本输入 中等 单行 / 多行、占位符、文本绑定 表单输入、简单文本编辑
PasswordBox 密码输入 中等 安全、掩码、显示 / 隐藏密码 密码 / 验证码输入
RichTextBox 富文本编辑 较低 格式化文本、图片、超链接 富文本编辑器、文档编辑

 

七、文本控件通用最佳实践

1. 性能优化

  • 大量静态文本用 TextBlock,避免嵌套 Label/TextBox;
  • 长文本展示设置TextWrapping="Wrap",禁用不必要的文本格式化;
  • RichTextBox 避免实时渲染复杂格式,可批量更新。

2. 易用性

  • 输入控件添加PlaceholderText,提示用户输入内容;
  • 密码框开启IsPasswordRevealButtonEnabled,提升体验;
  • 文本溢出时用TextTrimming="CharacterEllipsis",避免界面错乱。

3. 绑定规范

  • 输入控件绑定用Mode=TwoWay,根据需求选择UpdateSourceTrigger
  • 避免直接绑定 PasswordBox 的 Password 属性,用附加属性 / 事件实现;
  • 格式化文本优先用StringFormat,而非后台拼接字符串。

4. 样式统一

  • 通过全局 Style 统一文本控件样式,确保界面一致性:
 1 <Window.Resources>
 2     <Style TargetType="TextBlock" x:Key="TitleText">
 3         <Setter Property="FontSize" Value="16"/>
 4         <Setter Property="FontWeight" Value="Bold"/>
 5         <Setter Property="Foreground" Value="#333333"/>
 6     </Style>
 7 </Window.Resources>
 8 
 9 <!-- 使用全局样式 -->
10 <TextBlock Style="{StaticResource TitleText}" Text="页面标题"/>

总结

  1. WPF 文本控件分为 “展示类”(TextBlock/Label)和 “输入类”(TextBox/PasswordBox/RichTextBox),核心是根据场景选择合适的控件;
  2. 纯展示用 TextBlock(高性能),表单标签用 Label(带关联),简单输入用 TextBox,密码输入用 PasswordBox,富文本编辑用 RichTextBox;
  3. 关键最佳实践:输入控件加占位符、密码用 PasswordBox、长文本换行 / 溢出处理、绑定规范(TwoWay+UpdateSourceTrigger)。
掌握这些文本控件的用法,就能覆盖 WPF 应用中 90% 以上的文本展示和输入场景。
posted on 2026-03-22 16:51  工业搬砖猿Lee  阅读(87)  评论(0)    收藏  举报