WPF TextBlock 元素和 Label 控件有何区别?

107

在视觉上,以下两个代码片段产生相同的用户界面。那么为什么会有2个控件呢?
代码片段1

<TextBlock>Name:</TextBlock>
<TextBox Name="nameTextBox" />

片段2

<Label>Name:</Label>
<TextBox Name="nameTextBox" />

(我来回答这个问题...今天我从Programming WPF 学到了一个有用的技巧!)


4
为什么这个问题被标记为一个比它晚三年写的重复问题(特别是考虑到这个问题有更多点赞和更好的答案)? - BlueRaja - Danny Pflughoeft
6个回答

118

WPF文本块(Textblock)继承自FrameworkElement而不是像标签(Label)控件一样派生自System.Windows.Controls。这意味着文本块更加轻量级。使用文本块的缺点是不支持访问/加速键,也没有针对其他控件的链接。

当您仅想显示文本时,请使用TextBlock。该方式轻便高效地显示文本。

当您需要将文本与另一个控件(例如TextBox)关联时,请使用Label控件。其优点是具有访问键和对目标控件的引用。


13
@Kugel:我在链接的页面中没有看到关于“Label”的参考,所以我无法理解这是如何证明“TextBlock”比“Label”更慢的。你能否详细说明一下?根据http://joshsmithonwpf.wordpress.com/2007/07/04/differences-between-label-and-textblock/所述,如果“Label”使用“TextBlock”进行呈现,那么什么会导致“TextBlock”变慢?我看不到链接页面中有关“标签(Label)”的参考,因此我不明白为什么要拿它来证明“文本块(TextBlock)”比“标签(Label)”更慢。请问是否能再详细解释一下呢?按照http://joshsmithonwpf.wordpress.com/2007/07/04/differences-between-label-and-textblock/ 的说法,如果“标签(Label)”使用“文本块(TextBlock)”进行渲染,那么是什么导致了“文本块(TextBlock)”的速度变慢呢? - Mashmagar

21

标签有重要的焦点处理职责。它的目的是允许您放置一个带有访问键的标题。它具有一个Target属性,表示访问键的目标。像这样...

<Label Target="{Binding ElementName=nameTextBox}">_Name:</Label>
<TextBox x:Name="nameTextBox" />

在缺少目标属性的情况下,标签控件没有任何有用的作用。如果您按访问键,将听到蜂鸣声,表示“无法处理请求”。

有没有办法在具有TextBox的情况下获取针对该TextBox的Label? - Arsen Mkrtchyan
@ArsenMkrt - 你是指一个包含另一个TextBox的文本框吗?如果它有一个唯一的元素名称,那么它应该可以工作。 - Gishu
不是 @Gishu,我的意思是在你上面的例子中找到针对 TextBox 的 Label 的唯一方法是枚举可视树吗? - Arsen Mkrtchyan
@ArsenMkrt - 不确定,但看起来不太可能。你可以从绑定目标到源(标签到文本框)...但反过来不行。你为什么需要这个? - Gishu
我想记录用户在我的表单中的活动,并且希望为每个UI元素有一些唯一标识符。如果没有名称,我考虑从标签内容生成标识符,但我认为这不是一个好主意。类似于我在这里描述的东西:https://dev59.com/-Wkw5IYBdhLWcg3wSorA。 - Arsen Mkrtchyan
显示剩余2条评论

3
两个最常见的让TextBlocks和Labels混淆的原因是Windows Forms和常识。
1. 在Windows Forms中,当你想在表单上添加一小段文本时,你会使用一个Label,所以人们错误地认为在WPF中也应该使用Label。
2. 常识会让你相信Label比TextBlock更轻量级,但事实恰恰相反。
请注意,你可以将TextBlock放在Label中。

2

Label接受各种数据输入,例如字符串、数字等等...... 而TextBlock,顾名思义,只接受文本字符串。


2

使用TextBlock,我们可以轻松实现多行支持 - 使用TextWrapping

在这种情况下,例如显示验证消息时,使用Label需要使用<AccessKey>标记,这比TextBlock不太直观。

另一方面,使用TextBlock无法设置BorderBrush属性。

因此,对我来说,应该将这两个控件合并成一个文本全功能控件。


除了 TextBlock 不是控件之外,因此有一个非常重要的原因不要将它们组合在一起。 - Joey

-9

标签可以用作 TextBlock 的替代品,适用于需要最少文本支持的情况,例如控件的标签。使用标签可能更有优势,因为它比 TextBlock 需要更少的资源(更轻量级)。


8
这是不正确的。TextBlock在两者中更简单(轻量级)。它源自FrameworkElement。请参阅最受欢迎的答案。 - Gishu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接