1. 程式人生 > >wpf 的各個template

wpf 的各個template

不同 表達 只有一個 簡單的 lec sub 目前 對應關系 定義

--轉載

在使用TabControl、ListView、Menu、TreeView的時候被各種Template搞得頭昏眼花,決心把這個問題搞清楚,究竟什麽時候該用什麽Template?這是個麻煩的問題,欠揍的表達方法是“根據俺這麽多年寫程序的經驗,這是一個需要經驗才能解決的問題”。首先看一下相關幾個類的層次結構:
Control
|
+---- ContentControl
| |
| +---- ListBoxItem
| |
| +---- HeaderedContentControl
| |
| +---- TabItem
|
+---- ItemsControl
|
+---- TreeView
|
+---- MenuBase
|
+---- HeaderedItemsControl
| |
| +---- MenuItem
| |
| +---- TreeViewItem
|
+---- Selector
|
+---- TabControl
|
+---- ListBox

值得關註的類有四個,為了簡單清楚起見,給他們重新起名字:
  1. ContentControl:無標題的單元素容器
  2. HeaderedContentControl:有標題的單元素容器
  3. ItemsControl:無標題的多元素容器
  4. HeaderedItemsControl:有標題的多元素容器
各個類有不同的Template,引發我頭疼癥狀的一共有3個,也給他們重新起名字:
  1. ContentTemplate:單元素的容器畫單子元素的畫筆
  2. ItemTemplate:多元素的容器畫每個子元素的畫筆
  3. HeaderTemplate:有標題的容器畫標題的畫筆
好,一切到目前為止都很清晰。再來看看各個類都有哪些畫筆:
  1. ContentControl:無標題的單元素容器,只有畫單子元素的畫筆
  2. HeaderedContentControl:有標題的單元素容器,顯而易見,比上面多了一個畫標題的畫筆
  3. ItemsControl:無標題的多元素容器,只有一個畫每個子元素的畫筆ItemTemplate
  4. 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也沒有其他的畫筆了,這一對組合是最簡單的。

wpf 的各個template