多点实际行动,少点空想,日事日清
来源:互联网 发布:知君本无邪下载 编辑:程序博客网 时间:2024/05/01 23:46
WPF中各个Template的分析
在使用TabControl、ListView、Menu、TreeView的时候被各种Template搞得头昏眼花,决心把这个问题搞清楚,究竟什么时候该用什么Template?首先看一下相关几个类的层次结构:
Control
|
+---- ContentControl
| |
| +---- ListBoxItem
| |
| +---- HeaderedContentControl
| |
| +---- TabItem
|
+---- ItemsControl
|
+---- TreeView
|
+---- MenuBase
|
+---- HeaderedItemsControl
| |
| +---- MenuItem
| |
| +---- TreeViewItem
|
+---- Selector
|
+---- TabControl
|
+---- ListBox
Control
|
+---- ContentControl
| |
| +---- ListBoxItem
| |
| +---- HeaderedContentControl
| |
| +---- TabItem
|
+---- ItemsControl
|
+---- TreeView
|
+---- MenuBase
|
+---- HeaderedItemsControl
| |
| +---- MenuItem
| |
| +---- TreeViewItem
|
+---- Selector
|
+---- TabControl
|
+---- ListBox
值得关注的类有四个,为了简单清楚起见,给他们重新起名字:
- 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,这是一个有标题的单元素容器,有两个画笔,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也没有其他的画笔了,这一对组合是最简单的。
- 多点实际行动,少点空想,日事日清
- 拿出点实际行动来
- 方法论-项目开发,少点包袱,多点潇洒
- 多点诚意,少点套路,文章点击量不是问题!
- “马航客机失联”请多点克制少点猜想!
- 少了点什么?
- 少点无聊
- 我少了点什么?
- 数据点折线和多点标记绘制
- 实际行动的时候到了!
- 职业生涯规划,从实际行动开始
- 用实际行动建立自信
- 少走弯路的几点建议!
- "以后少点跟我联系"
- 一个实际行动胜过一打纲领
- 郁闷的空想
- 空想也是想法
- 实用主义与空想
- GCC 4.3.0 发布
- 毕业即将面临的问题 不知道有几个人能懂得解决?[转]
- GNOME 2.22
- EMC笔试题
- 取代Liferay的createacount模块
- 多点实际行动,少点空想,日事日清
- c语言常见误区
- 读书与思考(张五常)
- html 中 input 只能输入中文或数字
- helloworld程序
- html 中 input 禁止输入中文
- [收藏]ASP.NET生成高质量缩略图通用函数(VB.NET、c#代码)
- jade学习笔记一
- html 中 input 禁用中文输入法