wpf 的各個template
阿新 • • 發佈:2019-03-28
不同 表達 只有一個 簡單的 lec sub 目前 對應關系 定義 在使用TabControl、ListView、Menu、TreeView的時候被各種Template搞得頭昏眼花,決心把這個問題搞清楚,究竟什麽時候該用什麽Template?這是個麻煩的問題,欠揍的表達方法是“根據俺這麽多年寫程序的經驗,這是一個需要經驗才能解決的問題”。首先看一下相關幾個類的層次結構:
值得關註的類有四個,為了簡單清楚起見,給他們重新起名字:
他肚子裏的元素是TabItem,這是一個有標題的單元素容器,有兩個畫筆,ContentTemplate和HeaderTemplate。那麽TabItem的畫筆和TabControl的畫筆是什麽關系呢?
事實上我撒謊了:TabControl有兩個畫筆,ContentTemplate和ItemTemplate,而不是一個,其中ItemTemplate繼承自父類,而ContentTemplate是他自己重新定義的一個屬性——好,我們終於抓住了這個偽造身份證擾亂社會治安破壞和諧社會的家夥。這種做法雖然很混淆,但是帶來了方便,容器和元素的對應關系是
--轉載
在使用TabControl、ListView、Menu、TreeView的時候被各種Template搞得頭昏眼花,決心把這個問題搞清楚,究竟什麽時候該用什麽Template?這是個麻煩的問題,欠揍的表達方法是“根據俺這麽多年寫程序的經驗,這是一個需要經驗才能解決的問題”。首先看一下相關幾個類的層次結構:
Control
|
+---- ContentControl
| |
| +---- ListBoxItem
| |
| +---- HeaderedContentControl
| |
| +---- TabItem
|
+---- ItemsControl
|
+---- TreeView
|
+---- MenuBase
|
+---- HeaderedItemsControl
| |
| +---- MenuItem
| |
| +---- TreeViewItem
|
+---- Selector
|
+---- TabControl
|
+---- ListBox
值得關註的類有四個,為了簡單清楚起見,給他們重新起名字:
- ContentControl:無標題的單元素容器
- HeaderedContentControl:有標題的單元素容器
- ItemsControl:無標題的多元素容器
- HeaderedItemsControl:有標題的多元素容器
- 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也沒有其他的畫筆了,這一對組合是最簡單的。
wpf 的各個template