文本控件(Text Controls)
WPF 的文本控件是专门用于显示、编辑、格式化文本的核心控件,按 “只读展示” 和 “可编辑输入” 分为两大类,覆盖从简单文本展示到富文本编辑的全场景。下面逐个讲解最常用的文本控件,包含核心特性、实战用法和最佳实践。
一、TextBlock(轻量级文本展示控件)
核心特性
- 只读、轻量级、高性能(WPF 中最常用的文本展示控件);
- 支持行内格式化(不同字体 / 颜色 / 大小)、换行、文本溢出处理;
- 无 ContentTemplate 等额外开销,比 Label 更高效;
- 核心属性:
Text、FontSize、Foreground、TextWrapping、TextTrimming。
实战用法
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(单行文本输入控件)
核心特性
- 单行 / 多行文本输入,支持占位符、密码框、文本选择;
- 核心属性:
Text、IsReadOnly、IsEnabled、PlaceholderText、MaxLength、AcceptsReturn(是否允许多行); - 支持文本变更事件(
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="页面标题"/>
总结
- WPF 文本控件分为 “展示类”(TextBlock/Label)和 “输入类”(TextBox/PasswordBox/RichTextBox),核心是根据场景选择合适的控件;
- 纯展示用 TextBlock(高性能),表单标签用 Label(带关联),简单输入用 TextBox,密码输入用 PasswordBox,富文本编辑用 RichTextBox;
- 关键最佳实践:输入控件加占位符、密码用 PasswordBox、长文本换行 / 溢出处理、绑定规范(TwoWay+UpdateSourceTrigger)。
掌握这些文本控件的用法,就能覆盖 WPF 应用中 90% 以上的文本展示和输入场景。
浙公网安备 33010602011771号