在WPF中區別TextBlock和Label

2022-04-05 12:58:10 字數 2321 閱讀 9195

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的模板:

接下來是textblock的:

從兩段**中可以明顯地看出,label的模板更加複雜,而且textblock控制項沒有controltemplate部分,這和之前的visual tree也是相符合的。現在繼續controltemplate這個話題,label的controltemplate中包含乙個屬性觸發器(關於屬性觸發器知識,您可以參考我之前的文章),該觸發器的含義是:當label的isenabled發生變化時,它的前景色會發生變化,而textblock並不具備這個特性。

從以上這些分析中,可以得出這樣的結論:textblock屬於比較底層的控制項,因此它的效能要比label好一些。如果需求只是純文字的顯示,並且不提供access key的支援,那麼textblock是個不錯的選擇。

const在c c 中區別

c 中的const正常情況下是看成編譯期的常量,編譯器並不為const分配空間,只是在編譯的時候將期值儲存在名字表中,並在適當的時候折合在 中.所以,以下 include using namespace std int main for int i 0 i sizeof array sizeof a...

const在C和C 中區別

c 中的const正常情況下是看成編譯期的常量,編譯器並不為const分配空間,只是在編譯的時候將期值儲存在名字表中,並在適當的時候折合在 中.所以,以下 include using namespace std int main for int i 0 i sizeof array sizeof a...

SQLite與FMDB使用中區別

基本使用區別 1.資料庫的操作物件 1 sqlite通過sqlite3 sqlite3 db 2 fmdb方式 fmdatabase db 2.開啟資料庫方式 1 sqlite方式 void opendb else 2 fmdb方式 void opendb else 3.建立 1 sqlite方式 ...