天天看點

WPF中各個Template的分析(轉)

值得關注的類有四個,為了簡單清楚起見,給他們重新起名字:

ContentControl:無标題的單元素容器

HeaderedContentControl:有标題的單元素容器

ItemsControl:無标題的多元素容器

HeaderedItemsControl:有标題的多元素容器

各個類有不同的Template,引發我頭疼症狀的一共有3個,也給他們重新起名字:

ContentTemplate:單元素的容器畫單子元素的畫筆

ItemTemplate:多元素的容器畫每個子元素的畫筆

HeaderTemplate:有标題的容器畫标題的畫筆

好,一切到目前為止都很清晰。再來看看各個類都有哪些畫筆:

ContentControl:無标題的單元素容器,隻有畫單子元素的畫筆

HeaderedContentControl:有标題的單元素容器,顯而易見,比上面多了一個畫标題的畫筆

ItemsControl:無标題的多元素容器,隻有一個畫每個子元素的畫筆ItemTemplate

HeaderedItemsControl:有标題的多元素容器,也是顯而易見,多了一個畫标題的畫筆

同樣,一切都是理所當然,顯而易見。然而這時,混亂産生了:當“容器”和“元素”搭配到一起的時候,各種畫筆就開始複雜起來了。現在來分析幾個典型的容器和元素的搭配:

1、TabControl和TabItem

TabControl本身是一個無标題的多元素容器,按上面所述,沒有标題畫筆,隻有一個畫每個子元素的ItemTemplate畫筆。

他肚子裡的元素是TabItem,這是一個有标題的單元素容器,有兩個畫筆,ContentTemplate和HeaderTemplate。那麼TabItem的畫筆和TabControl的畫筆是什麼關系呢?

事實上我撒謊了:TabControl有兩個畫筆,ContentTemplate和ItemTemplate,而不是一個,其中ItemTemplate繼承自父類,而ContentTemplate是他自己重新定義的一個屬性——好,我們終于抓住了這個僞造身份證擾亂社會治安破壞和諧社會的家夥。這種做法雖然很混淆,但是帶來了友善,容器和元素的對應關系是

TabItem的HeaderTemplate就是TabControl的ItemTemplate

TabItem的ContentTemplate就是TabControl的ContentTemplate

2、Menu和MenuItem

Menu隻有一個ItemTemplate,MenuItem有HeaderTemplate和ItemTemplate。這裡其實有兩個搭配,一個是Menu和MenuItem的搭配,另一個是MenuItem和MenuItem的搭配。在這兩個搭配中,有以下共同點:

容器的ItemTemplate變成元素的HeaderTemplate

每個MenuItem都用自己對應的HeaderTemplate來顯示自己

這是一個分級的結構,WPF提供了HierarchicalDataTemplate,很友善,不過暫時先不說這個,免得問題更加複雜化。

3、TreeView和TreeViewItem

從上面的類層次結構可以看出,這個搭配和Menu/MenuItem的情況應該是一樣的,事實上在XAML中很容易在TreeView和Menu之間切換,容易到了隻需要改幾個tag就可以,可見兩者是“同構”的。

4、ListBox和ListBoxItem

ListBox本身是一個無标題的多元素容器,隻有一個ItemTemplate。ListBox是遵紀守法的好同志,不像TabControl僞造了一個ContentTemplate。他的ItemTemplate就是ListBoxItem的ContentTemplate,并且ListBoxItem也沒有其他的畫筆了,這一對組合是最簡單的。