标签和文本块的区别

167

1
在Silverlight中,标签控件在验证后会自动更改(文本变为红色)。但是WPF则不同。 - vortexwolf
5个回答

266

TextBlock不是一个控件

TextBlock虽然位于System.Windows.Controls命名空间中,但它不是一个控件。它直接派生自FrameworkElement。而Label则从ContentControl派生。

这意味着Label可以:

  1. 通过Template属性获得自定义控件模板。
  2. 显示除字符串以外的其他数据(通过Content属性)。
  3. DataTemplate应用到其内容(通过ContentTemplate属性)。
  4. 执行任何一个ContentControl能够而FrameworkElement不能做到的事情。

    • Label禁用时文字会变灰
    • Label支持访问键
    • LabelTextBlock重很多

来源

以下是一些更有趣的阅读材料


1
关于你的第二点:可以将DateTime绑定到TextBlock。 - oddRaven
1
如果我没说错的话,我认为TextBlock更有效率。 - Shimmy Weitzhandler

33

标签通常只支持单行文本输出,而 TextBlock 则用于多行文本显示。

例如,在 wpf 中,TextBlock 具有一个名为 TextWrapping 的属性,可实现多行输入;而 Label 没有此功能。


9
标签具有任意的“Content”属性,它可以是一个字符串,也可以是TextBlock(或其他任何控件),因此通过将TextBlock用作内容,标签可以成为多行文本。 - Jim Balter

30

标签ContentControl,这意味着您可以将任何内容设置为其内容。绝对包括字符串、数字、日期、其他控件、图像、形状等。而TextBlock仅能处理字符串


3
“other controls” 包括 TextBlock,因此 Label 可以包含换行文本。 - Jim Balter

12

虽然TextBlock和Label都用于显示文本,但它们在其内部实现上是非常不同的。

=> Label 继承自 ContentControl,这是一个基类,可以显示几乎任何类型的 UI。

=> 另一方面,TextBlock 直接继承自 FrameworkElement,因此缺少从 Control 所有继承元素中通用的行为。 TextBlock 浅层次的继承体系使得控件比 Label 更轻量化,更适合用于简单、非交互式场景。

PS:但是,如果您想让 访问键 生效或想要更灵活或图形化的设计,您需要使用 Label。


2

可能最令人烦恼的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>

产生的结果如下图所示:

enter image description here

您可以在这里了解更多信息。


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