视觉上,以下两个代码段都会生成相同的UI。那么为什么有2个控件..
Snippet1
<TextBlock>Name:</TextBlock>
<TextBox Name="nameTextBox" />
Snippet2
<Label>Name:</Label>
<TextBox Name="nameTextBox" />
(嗯,我自己会回答这个问题......认为这是我今天从Programming WPF 学到的一个有用的消息。)
答案 0 :(得分:110)
WPF Textblock继承自 FrameworkElement ,而不是像Label Control那样从 System.Windows.Control 派生。这意味着Textblock更轻量级。使用文本块的缺点是不支持Access / Accerelator Keys,并且没有指向其他控件的链接作为目标。
如果您想单独显示文字,请使用TextBlock 。这样做的好处是可以轻松,高效地显示文本。
如果要将文本与TextBox等其他控件关联,请使用Label控件 。好处是访问键和目标控件的引用。
答案 1 :(得分:20)
标签具有重要的焦点处理责任。其目的是允许您使用访问密钥放置标题。它具有目标属性,表示访问密钥的目标。像这样......
<Label Target="{Binding ElementName=nameTextBox}">_Name:</Label>
<TextBox x:Name="nameTextBox" />
在没有Target属性的情况下,Label控件没有任何用处。如果您按下指示“无法处理请求”的访问键,您将听到一声蜂鸣声
答案 2 :(得分:3)
关于TextBlocks和Labels混淆的两个最大原因是Windows Forms和常识。
当您想在Windows窗体中对表单上的一小段文本进行打击时,您使用了一个Label,因此它(错误地)跟随您使用WPF标签执行相同的操作。
常识会让你相信标签是轻量级的而TextBlock不是,当相反的情况属实时。
请注意,您可以将TextBlock放在Label中。
答案 3 :(得分:2)
使用TextBlock
我可以轻松获得多行支持 - 使用TextWrapping
。
在这种情况下使用Label
,例如显示验证邮件时,需要使用<AccessKey>
标记,这不像TextBlock
那样直截了当。
另一方面,使用TextBlock
不允许我们设置BorderBrush
属性。
所以,对我来说,两个控件应该组合成一个文本全功能控件。
答案 4 :(得分:2)
Label采用各种数据输入,如String,Number等...... 顾名思义,TextBlock只接受文本字符串。
答案 5 :(得分:-9)
对于需要最少文本支持的情况(如控件的标签),可以使用Label作为TextBlock的替代方法。使用Label可能是有利的,因为它需要更少的资源(更轻的重量),然后是TextBlock。