[转]在WPF中区别TextBlock和Label

TextBlock和Label都是用来显示少量数据的。好多文章对Label存在的描述都是它允许使用"快速获取"。"快速获取"就是允许你用Alt加上其它的按键快速和UI界面的某个控件交互,比如你可以用ALT加上O键来点击一个OK按钮。

TextBlock直接继承于FrameworkElement,而Label继承于ContentControl。这样看来,Label可以做这样的事情:

1.可以定义一个控件模板(通过Template属性)

2.可以显示出string以外的其他信息(通过Content属性)

3.为Label内容添加一个DataItemplate(通过ContentTemplate属性)

4.做一些FrameworkElement元素不能做的事情

下边是一个TextBlock和Label的继承关系图

当Label不可用的时候它的Text显示为灰色,但是TextBlock不会

上例中UserName为TextBlock,Password为Label。

当Label禁用时候它的Content变为灰色的原因是因为Label的默认模板中有一个触发器,当 Label禁用的时候它会设置Content的颜色。

如果要改变Label禁用时的样式可以在这改变。

Label比TextBlock更加复杂

以上说了Label相当于TextBlock的优势,下面说一下TextBlock的优势

加载Label时比TextBlock需要耗费更多的时间,不仅仅是Label相对于直接继承于FrameElement的TextBlock有了更多层次的继承,它的visual tree更加复杂。

下面的图片告诉你是当你创建一个Label的时候后台都做了什么事情。

TextBlock的visual tree不包含任何子元素,而Label却复杂的多。它有一个border属性,最后通过一个TextBlock来显示内容。这样看来label其实就是一个个性化的TextBlock。

补充:

TextBlock和Label都可以显示文本,属于WPF中比较常用的控件。在最初接触WPF时,我经常为如何选择这两个控件感到困惑。随着对WPF深入学习,对这两个控件也有一些了解。今天就说一些我对TextBlock和Label的看法吧。

Label和TextBlock都是System.Windows.Controls命名空间下的类,但二者的父类并不相同。TextBlock继承自System.Windows.FrameworkElement,从这个角度讲,TextBlock不能称之为“控件”(因为它没有继承Control类,关于Control类,我会在WPF Unleashed第四章为大家介绍),而Label继承自System.Windows.ContentControl。FrameworkElement是非常底层的类,它同时也是ContentControl的父类。所以,Label相对TextBlock更加高级一些,它能够完成TextBlock所无法完成的工作。例如对于Access key的支持,而且我们可以在Label内可以放置任意对象,而TextBlock只能显示文本。

现在我们从Visual Tree(Luna主题下)的角度看看两者的区别: 
 

Label TextBlock

从图中可以看出,Label控件由三个元素组成,其最底层的元素就是TextBlock。而TextBlock的Visual Tree只有它本身。所以可以说Label控件包含着TextBlock。

接下来从模板的角度看一下二者的区别。首先是Label的模板:

<Style TargetType="{x:Type Label}" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib"> 
<Style.Resources> 
<ResourceDictionary /> 
</Style.Resources> 
<Setter Property="TextElement.Foreground"> 
<Setter.Value> 
<DynamicResource ResourceKey="{x:Static SystemColors.ControlTextBrushKey}" /> 
</Setter.Value> 
</Setter> 
<Setter Property="Panel.Background"> 
<Setter.Value> 
<SolidColorBrush> 
#00FFFFFF</SolidColorBrush> 
</Setter.Value> 
</Setter> 
<Setter Property="Control.Padding"> 
<Setter.Value> 
<Thickness> 
5,5,5,5</Thickness> 
</Setter.Value> 
</Setter> 
<Setter Property="Control.HorizontalContentAlignment"> 
<Setter.Value> 
<x:Static Member="HorizontalAlignment.Left" /> 
</Setter.Value> 
</Setter> 
<Setter Property="Control.VerticalContentAlignment"> 
<Setter.Value> 
<x:Static Member="VerticalAlignment.Top" /> 
</Setter.Value> 
</Setter> 
<Setter Property="Control.Template"> 
<Setter.Value> 
<ControlTemplate TargetType="{x:Type Label}"> 
<Border BorderBrush="{TemplateBinding Border.BorderBrush}" BorderThickness="{TemplateBinding Border.BorderThickness}" Background="{TemplateBinding Panel.Background}" SnapsToDevicePixels="True" Padding="{TemplateBinding Control.Padding}"> 
<ContentPresenter HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}" RecognizesAccessKey="True" Content="{TemplateBinding ContentControl.Content}" /> 
</Border> 
<ControlTemplate.Triggers> 
<Trigger Property="UIElement.IsEnabled"> 
<Setter Property="TextElement.Foreground"> 
<Setter.Value> 
<DynamicResource ResourceKey="{x:Static SystemColors.GrayTextBrushKey}" /> 
</Setter.Value> 
</Setter> 
<Trigger.Value> 
<s:Boolean> 
False</s:Boolean> 
</Trigger.Value> 
</Trigger> 
</ControlTemplate.Triggers> 
</ControlTemplate> 
</Setter.Value> 
</Setter> 
</Style>

接下来是TextBlock的: 
<Style TargetType="{x:Type TextBlock}" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
<Style.Resources> 
<ResourceDictionary /> 
</Style.Resources> 
<Setter Property="TextBlock.TextWrapping"> 
<Setter.Value> 
<x:Static Member="TextWrapping.NoWrap" /> 
</Setter.Value> 
</Setter> 
<Setter Property="TextBlock.TextTrimming"> 
<Setter.Value> 
<x:Static Member="TextTrimming.None" /> 
</Setter.Value> 
</Setter> 
</Style>

从两段代码中可以明显地看出,Label的模板更加复杂,而且TextBlock控件没有ControlTemplate部分,这和之前的Visual Tree也是相符合的。现在继续ControlTemplate这个话题,Label的ControlTemplate中包含一个属性触发器(关于属性触发器知识,您可以参考我之前的文章),该触发器的含义是:当Label的IsEnabled发生变化时,它的前景色会发生变化,而TextBlock并不具备这个特性。

从以上这些分析中,可以得出这样的结论:TextBlock属于比较底层的控件,因此它的性能要比Label好一些。如果需求只是纯文本的显示,并且不提供Access key的支持,那么TextBlock是个不错的选择。

转自:http://www.cnblogs.com/junbird-nest/archive/2012/10/08/2715601.html

时间: 2024-10-26 13:11:06

[转]在WPF中区别TextBlock和Label的相关文章

WPF中让TextBlock每一个字符显示不同的颜色

原文:WPF中让TextBlock每一个字符显示不同的颜色 XAML代码: <TextBlock x:Name="tb"> <Run Foreground="Red">R</Run> <Run Foreground="Green">G</Run> <Run Foreground="Blue">B</Run> <Run Text="

WPF中使用TextBlock显示长字符串的处理方法

原文:WPF中使用TextBlock显示长字符串的处理方法 在WPF中,有时候要显示长字符串,需要用到换行或者截短的情况,方法如下: 换行 可以使用<LineBreak/>标记换行: 可以用TextWrapping属性(如非特殊,推荐用这种方式,自动.自适应).它可以有NoWrap(不换行.缺省值).Wrap(换行).WrapWithOverflow(换行但允许超出文本块的宽度).WrapWithOverflow在换行的算法没办法确定如何正确换行(比如某个单词超长.换不换都超出宽度)时,允许行

WPF中使用TextBlock的Inlines属性来完成复杂的文字内容

参考:http://blog.csdn.net/zhangjiyehandsom/article/details/5498845 1. 需求:要在一行内容中显示不同颜色以及粗细不一的字体, 解决办法:可以使用多个Label来显示这个功能,但是这个方法太笨来, 可以直接使用TextBlock的Inlines属性 例子如下:http://my.oschina.net/owen123456/blog/162190 目前正在赶项目,到时有空再回来详细书写

WPF中的TextBlock隐藏边框

TextBlock默认是有边框的,显示效果如下:有一个淡蓝色的边框围绕着 如果需要隐藏这个边框,则只需要在代码中加上以下代码即可: BorderBrush="{x:Null}" BorderThickness="0" <TextBox Text="Hello" Width="480" TextWrapping="Wrap" IsReadOnly="True" BorderBrush

WPF中的TextBlock处理长字符串

Xaml: <StackPanel> <TextBlock Margin="10" Foreground="Red"> This is a TextBlock control<LineBreak /> with multiple lines of text. </TextBlock> <TextBlock Margin="10" TextTrimming="CharacterElli

WPF学习二:TextBlock和Label的区别

TextBlock和Label都是用来显示少量数据的.好多文章对Label存在的描述都是它允许使用"快速获取"."快速获取"就是允许你用Alt加上其它的按键快速和UI界面的某个控件交互,比如你可以用ALT加上O键来点击一个OK按钮. TextBlock直接继承于FrameworkElement,而Label继承于ContentControl.这样看来,Label可以做这样的事情: 1.可以定义一个控件模板(通过Template属性) 2.可以显示出string以外的

WPF快速指导10:WPF中的事件及冒泡事件和隧道事件(预览事件)的区别

本文摘要: 1:什么是路由事件: 2:中断事件路由: 3:自定义路由事件: 4:为什么需要自定义路由事件: 5:什么是冒泡事件和预览事件(隧道事件): 1:什么是路由事件 WPF中的事件为路由事件,所谓路由事件,MSDN定义如下: 功能定义:路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事件的对象)调用处理程序的事件. 实现定义:路由事件是一个 CLR 事件,可以由 RoutedEvent 类的实例提供支持并由 Windows Presentation Foundation (W

关于WPF中关于样式和模板的区别

百度了下,改天整理. WPF中关于样式和模板的区别: 回答一: 1.WPF样式类似于Web应用程序中的CSS,在WPF中可以为控件定义统一的样式(Style).样式属于资源的一种,例如为Button定义统一的背景颜色和字体: <Window.Resources> <Style  TargetType="Button"> <Setter Property="Background" Value="Yellow" />

WPF中Label使用StringFormat

1. 在WPF中Label的Content有时内容只需要改变个别数字,而不需要所以内容都修改,这时候就要使用StringFormat, 如: <Label Content="I have xxx friends"/> 这里面的xxx是个变量,那在Binding时应该怎样写呢 1 <Label Content="{Binding FirendNumber, StringFormat='I have {0} firends}"/> 2 当我们这样