TextBlock和Label都是用來顯示少許數據的。好多文章對Label存在的描述都是它容許使用"快速獲取"。"快速獲取"就是容許你用Alt加上其它的按鍵快速和UI界面的某個控件交互,好比你能夠用ALT加上O鍵來點擊一個OK按鈕。html
TextBlock直接繼承於FrameworkElement,而Label繼承於ContentControl。這樣看來,Label能夠作這樣的事情:app
1.能夠定義一個控件模板(經過Template屬性)性能
2.能夠顯示出string之外的其餘信息(經過Content屬性)學習
3.爲Label內容添加一個DataItemplate(經過ContentTemplate屬性)spa
4.作一些FrameworkElement元素不能作的事情3d
下邊是一個TextBlock和Label的繼承關係圖xml
當Label不可用的時候它的Text顯示爲灰色,可是TextBlock不會htm
上例中UserName爲TextBlock,Password爲Label。對象
當Label禁用時候它的Content變爲灰色的緣由是由於Label的默認模板中有一個觸發器,當 Label禁用的時候它會設置Content的顏色。blog
若是要改變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