--转载

在使用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的更多相关文章

  1. WPF中各个Template的分析(转)

    作为新手,还是没看明白本文,留着以后再学习 在使用TabControl.ListView.Menu.TreeView的时候被各种Template搞得头昏眼花,决心把这个问题搞清楚,究竟什么时候该用什么 ...

  2. WPF Style和Template

    WPF中的Style类似于Web应用程序中的CSS,它是控件的一个属性,属于资源的一种. ControlTemplate和DataTemplate区别: ControlTemplate用于改变控件原来 ...

  3. WPF Template模版之DataTemplate与ControlTemplate【一】

    WPF Template模版之DataTemplate与ControlTemplate[一] 标签: Wpf模版 2015-04-19 11:52 510人阅读 评论(0) 收藏 举报  分类: -- ...

  4. 【转】WPF Template模版之DataTemplate与ControlTemplate(一)

    WPF系统不但支持传统的Winfrom编程的用户界面和用户体验设计,更支持使用专门的设计工具Blend进行专业设计,同时还推出了以模板为核心的新一代设计理念. 1. 模板的内涵 作为表现形式,每个控件 ...

  5. 《深入浅出WPF》笔记四

    1.WPF资源分布:数据库.资源文件.WPF对象资源.变量2.每个WPF的界面都具有一个名为Resources的属性,其类型为ResourceDictionary,以键值对的形式存储资源.3.检索资源 ...

  6. WPF模板(一)详细介绍

    本次随笔来源于电子书,人家的讲解很好,我就不画蛇添足了. 图形用户界面应用程序较之控制台界面应用程序最大的好处就是界面友好.数据显示直观.CUI程序中数据只能以文本的形式线性显示,GUI程序则允许数据 ...

  7. WPF学习之深入浅出话模板

    图形用户界面应用程序较之控制台界面应用程序最大的好处就是界面友好.数据显示直观.CUI程序中数据只能以文本的形式线性显示,GUI程序则允许数据以文本.列表.图形等多种形式立体显示. 用户体验在GUI程 ...

  8. 2000条你应知的WPF小姿势 基础篇<69-73 WPF Freeze机制和Template>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...

  9. WPF QuickStart系列之样式和模板(Style and Template)

    在WPF桌面程序中,当我们想构建一个统一的UI表现时(在不同操作系统下,显示效果一致),此时我们就需要使用到WPF中的样式和模板技术.简单来说,如果我们需要简单的给一个Button设置宽,高,Marg ...

随机推荐

  1. python开发基础之数据类型、字符编码、文件操作

    一.知识点 1.身份运算: 2.现在计算机系统通用的字符编码工作方式:在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码.用记事本编辑的时候,从文件 ...

  2. Mybatis 常用注解

    Mybatis常用注解对应的目标和标签如表所示: 注解 目标 对应的XML标签 @CacheNamespace 类 <cache> @CacheNamespaceRef 类 <cac ...

  3. 前端笔记之JavaScript(五)关于数组和字符串那点事

    一.数组 1.1数组概念 数组(array)是一个有序的数据集合.说白了,数组就是一组数.数组内部可以存放一个或多个单独的数据,整体组成数组. 定义数组最简单的方式:数组字面量. 数组的字面量“[]” ...

  4. cocos2dx-lua http请求下载图片,使用XMLHttpRequest类

    HttpFileDownLoadSimple.lua local downloader = {} --数据拆分,以没1024*5字节拆成一段,打包写入文件 (拆完再拼接,转成字符串) local fu ...

  5. 总结fiddle

    fiddler重新发送请求   模拟限速 http://caibaojian.com/fiddler.html fiddler模拟限速的原理 我们可以通过fiddler来模拟限速,因为fiddler本 ...

  6. Django 之 路由URL,视图,模板,ORM操作

    1.后台管理的左侧菜单,默认只有第一个页签下面的选项是显示的,点了别的页签再显示别的页签下面的选项,问题是:点了任何菜单的选项后,左侧菜单又成了第一个页签的选项显示,别的页签隐藏,也就是左侧的菜单刷新 ...

  7. Python-数据类型之字典

    一: 概述 字典是有大括号,逗号分隔,有k/v组成 字典的键必须hashable,如数字,字符串,布尔值,元组 二: 操作 2.1 增 2.1.1  直接赋值 如果键不存在,则增加 dic = {'n ...

  8. Redis实战 - 2.list、set和Sorted Set

    List Redis的List是通过Linked List(链表)来实现的String集合,所以插入数据的速度很快. 但是缺点就是在数据量比较大的时候,访问某个数据的时间可能会很长,但针对这种情况,可 ...

  9. BootstrapTable,选中某几行,获取其数据并进行后台处理。以及其他的属性使用。

    参考链接:bootstrap Table API 中文版 Bootstrap Table 选中某几行,获取其数据 Ajax传递数组,struts2接收数组 1.首先将复选框搞出来,<table ...

  10. Tomcat 启动报错SEVERE: Unable to process Jar entry [javassist/util/proxy/SerializedProxy$1.class]

    错误信息 springboot + spring mvc 的maven项目,在tomcat启动的时候报错,错误信息如下: SEVERE: Unable to process Jar entry [ja ...