核心概念:
Label
控件是 WPF 中用于显示文本内容 的基本控件。它的主要目的是为其他控件(如 TextBox
、ComboBox
、ListBox
等)提供描述性文本标签 ,并且它有一个独特的关键功能:支持助记符(Access Key/Mnemonics)。
主要特性与用途:
- 文本显示: 最基本的功能,用于展示静态或动态绑定的文本。
- 助记符(Access Keys): 这是
Label
区别于简单文本显示控件(如TextBlock
)的核心特性。- 通过在标签文本中的某个字母前添加下划线
_
(例如_Name:
),可以定义一个快捷键(助记符)。 - 当用户按下
Alt
+ 带下划线的字母时(例如Alt + N
),焦点会立即跳转到 与该Label
关联的目标控件(通过Target
属性指定)。 - 这极大地提高了使用键盘导航表单和应用程序的效率及可访问性。
- 通过在标签文本中的某个字母前添加下划线
- 内容控件:
Label
继承自ContentControl
。这意味着:- 它不仅可以包含简单的文本(
string
),还可以包含更复杂的内容作为其Content
属性,例如:- 其他 UI 控件(
Image
,StackPanel
,Button
等 - 虽然不常见,但有此能力) - 数据绑定的对象(配合
ContentTemplate
定义显示方式)
- 其他 UI 控件(
- 这提供了比
TextBlock
更大的灵活性,尽管对于纯文本场景,TextBlock
通常更轻量级。
- 它不仅可以包含简单的文本(
关键属性:
-
Content
(object):-
最重要且最常用的属性。定义
Label
显示的内容。 -
可以是字符串:
Content="Username:"
-
可以是其他对象(需要配合模板或
ToString()
):Content="{Binding CurrentUser}"
-
可以是复杂 UI 元素:
Content="
xml<StackPanel Orientation="Horizontal"> <Image Source="user.png" Width="16" Height="16"/> <TextBlock Text="Username:" Margin="5,0,0,0"/> </StackPanel>
-
-
Target
(IInputElement):- 核心功能属性。 指定当用户按下该
Label
的助记符时,哪个控件应该获得焦点。 - 通常使用
{Binding ElementName=...}
绑定到目标控件的名称。 - 示例:
Target="{Binding ElementName=txtUserName}"
- 核心功能属性。 指定当用户按下该
-
ContentStringFormat
(string):- 当
Content
是绑定数据时,用于格式化其字符串表示形式(类似于String.Format
)。 - 示例:
Content="{Binding Price}" ContentStringFormat="C2"
(显示为货币格式,两位小数)。
- 当
-
ContentTemplate
(DataTemplate):- 当
Content
是非字符串对象(尤其是自定义对象或集合)时,定义如何可视化呈现该内容。 - 提供了强大的自定义显示能力。
- 当
-
Padding
(Thickness):- 设置
Label
内容区域周围的内部边距。 - 示例:
Padding="5"
或Padding="2,5,2,5"
(左,上,右,下)。
- 设置
-
HorizontalContentAlignment
/VerticalContentAlignment
(HorizontalAlignment/VerticalAlignment):- 控制内容在
Label
内容区域内的水平和垂直对齐方式。 - 示例:
HorizontalContentAlignment="Right"
,VerticalContentAlignment="Center"
.
- 控制内容在
-
BorderBrush
/BorderThickness
(Brush / Thickness):- 设置
Label
边框的颜色和粗细。默认通常无边框。
- 设置
与 TextBlock 的主要区别:
特性 | Label | TextBlock |
---|---|---|
核心目的 | 为其他输入控件提供标签,支持助记符 | 显示只读文本内容,支持丰富文本格式 |
助记符 | 支持 (使用 _ ) |
不支持 |
继承自 | ContentControl |
FrameworkElement |
内容 (Content ) |
单一对象 (可以是任何类型,使用模板渲染) | 文本内容 (Text 属性),或内联元素 (Inlines ) |
内容灵活性 | 高 (可包含任意内容) | 中 (主要是文本和内联元素) |
性能 | 稍重 (因是 ContentControl ) |
更轻量级 (更适合大量文本或简单标签) |
典型使用场景 | 表单字段标签 (带助记符) | 段落文本、简单标识、不需要助记符的标签 |
基本使用方法示例:
-
最简单的文本标签:
xml<Label Content="Username:" />
-
使用助记符并关联目标控件:
xml<Label Content="_Name:" Target="{Binding ElementName=txtName}" /> <TextBox x:Name="txtName" />
- 用户按下
Alt + N
,光标会跳转到txtName
文本框。
- 用户按下
-
绑定数据并格式化:
xml<Label Content="{Binding ProductPrice}" ContentStringFormat="Price: {0:C}" /> <!-- 假设 ProductPrice 是 19.99, 显示为 "Price: $19.99" -->
-
设置边距和对齐:
xml<Label Content="Description:" Padding="5" HorizontalContentAlignment="Right" FontWeight="Bold" />
-
包含复杂内容 (不常见,展示灵活性):
xml<Label> <StackPanel Orientation="Horizontal"> <Image Source="warning.png" Width="16" Height="16" Margin="0,0,5,0"/> <TextBlock Text="Important Note!" Foreground="Red"/> </StackPanel> </Label>
最佳实践:
- 优先使用 Label 关联输入控件: 当需要为
TextBox
、ComboBox
、CheckBox
、RadioButton
、ListBox
等可聚焦控件提供标签时,务必使用Label
并设置Target
属性和助记符 (_
)。这极大地提升了键盘操作体验和可访问性(对屏幕阅读器用户友好)。 - 纯文本显示用 TextBlock: 如果只是显示一段静态的、不需要关联到输入控件焦点、也不需要助记符的描述性文本、标题或段落,优先使用
TextBlock
,因为它更轻量级。 - 合理使用复杂内容: 虽然
Label
可以包含复杂内容,但需谨慎。通常,简单文本或带图标的简单组合是合理的。更复杂的布局可能更适合放在GroupBox
、Border
或其他容器内,用Label
仅作标题。 - 利用绑定和格式化: 结合
Content
绑定和ContentStringFormat
可以动态显示并格式化数据。 - 注意样式一致性: 使用
Style
资源为应用程序中的Label
定义统一的字体、颜色、边距等外观,保持界面一致性。
总结:
WPF 的 Label
控件是构建用户界面表单和提供可访问性的关键组件。它的核心价值在于通过助记符 (_
) 和 Target
属性 ,将描述性文本标签与对应的输入控件紧密关联,实现高效的键盘导航。虽然它可以显示复杂内容,但在大多数场景下,将其用于关联输入控件并利用其助记符功能是最佳实践。对于不需要关联焦点的纯文本展示,TextBlock
通常是更优的选择。理解 Label
和 TextBlock
的区别并根据场景正确选用它们,是设计良好 WPF 界面的基础。