根据Windows应用程序开发 - Microsoft .NET 4 70-511培训包中的说明:
Label
控件和TextBlock
控件有什么区别,因为它们都是内容控件,仅用于显示文本?
根据Windows应用程序开发 - Microsoft .NET 4 70-511培训包中的说明:
Label
控件和TextBlock
控件有什么区别,因为它们都是内容控件,仅用于显示文本?
TextBlock
虽然位于System.Windows.Controls命名空间中,但它不是一个控件。它直接派生自FrameworkElement
。而Label
则从ContentControl
派生。
这意味着Label
可以:
Template
属性获得自定义控件模板。Content
属性)。DataTemplate
应用到其内容(通过ContentTemplate
属性)。执行任何一个ContentControl
能够而FrameworkElement
不能做到的事情。
Label
禁用时文字会变灰Label
支持访问键Label
比TextBlock
重很多以下是一些更有趣的阅读材料
TextBlock
更有效率。 - Shimmy Weitzhandler标签通常只支持单行文本输出,而 TextBlock 则用于多行文本显示。
例如,在 wpf 中,TextBlock 具有一个名为 TextWrapping
的属性,可实现多行输入;而 Label 没有此功能。
标签
是ContentControl
,这意味着您可以将任何内容设置为其内容。绝对包括字符串、数字、日期、其他控件、图像、形状等。而TextBlock
仅能处理字符串
。
虽然TextBlock和Label都用于显示文本,但它们在其内部实现上是非常不同的。
=> Label 继承自 ContentControl,这是一个基类,可以显示几乎任何类型的 UI。
=> 另一方面,TextBlock 直接继承自 FrameworkElement,因此缺少从 Control 所有继承元素中通用的行为。 TextBlock 浅层次的继承体系使得控件比 Label 更轻量化,更适合用于简单、非交互式场景。
PS:但是,如果您想让 访问键 生效或想要更灵活或图形化的设计,您需要使用 Label。
可能最令人烦恼的TextBlock
特性是其隐式样式查找行为,仅限于最近的DataTemplate
范围内。这是非Control
xaml元素的默认行为。
<StackPanel Orientation="Vertical">
<StackPanel.Resources>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="Red"/>
</Style>
<Style TargetType="Label">
<Setter Property="Foreground" Value="Red"/>
</Style>
</StackPanel.Resources>
<ContentControl Content="Test">
<ContentControl.ContentTemplate>
<DataTemplate>
<TextBlock Text="{Binding}"/>
</DataTemplate>
</ContentControl.ContentTemplate>
</ContentControl>
<ContentControl Content="Test">
<ContentControl.ContentTemplate>
<DataTemplate>
<Label Content="{Binding}"/>
</DataTemplate>
</ContentControl.ContentTemplate>
</ContentControl>
</StackPanel>
产生的结果如下图所示:
您可以在这里了解更多信息。