WPF中各个Template的分析(转)

作为新手,还是没看明白本文,留着以后再学习

在使用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也没有其他的画笔了,这一对组合是最简单的。

时间: 2024-12-23 03:48:05

WPF中各个Template的分析(转)的相关文章

WPF中MVVM模式原理分析与实践[转]

1, 前提 可以说MVVM是专为WPF打造的模式, 也可以说MVVM仅仅是MVC的一个变种, 但无论如何, 就实践而言, 如果你或你的团队没有使用"Binding"的习惯, 那么研究MVVM就没有多大意义. 另外,个人觉得, 使用Command以及打造一种合理的简化的方式去使用Command也与使用Binding一样重要. 2, 诞生 为了解决现实世界中的问题,我们需要将现实世界中的事物加以抽象, 然后得到了Domain Object, 无论贫血的还是富血的, 我们都可以简单地把他们归

WPF中MVVM模式原理分析与实践

1, 前提 可以说MVVM是专为WPF打造的模式, 也可以说MVVM仅仅是MVC的一个变种, 但无论如何, 就实践而言, 如果你或你的团队没有使用"Binding"的习惯, 那么研究MVVM就没有多大意 义. 另外,个人觉得, 使用Command以及打造一种合理的简化的方式去使用Command也与使用 Binding一样重要. 2, 诞生 为了解决现实世界中的问题,我们需要将现实世界中的事物加以抽象, 然后得到了 Domain Object, 无论贫血的还是富血的, 我们都可以简单地把

WPF中数据绑定的Validation应用分析

本来在写WPF Bug清单系列,但是写到第三篇(突然消失的ListViewItem)的时候发现重现BUG的逻辑 很复杂.而且需要比较多的基础知识,如果不先解释清楚,实在是怕有人用"不用Valiation不就行了" 等回复来砸场子.^_^ 本文从设计和应用的角度对DataBinding的Validation的不足进行了分析,假设读者使用过 DataBinding中的Validation.着重介绍WPF中DataBinding的Validation.有关数据绑定的基础知识请参 考MSDN.

.NET框架WPF中加载高质量大图慢的性能优化

最近的项目中,遇到一个关于WPF中同时加载多张图片时,内存占用非常高的问题. 问题背景: 在一个ListView中同时加载多张图片,注意:我们需要加载的图片分辨率非常高. 代码: XAML: <Grid>     <Grid.RowDefinitions>         <RowDefinition Height="Auto"/>         <RowDefinition Height="*"/>     <

wpf中的触发器详解

原文 http://zwkufo.blog.163.com/blog/static/25882512009724113250883/ 7.1.2 简单逻辑的表示--触发器(1) 在本章的多处介绍中都会涉及触发器的使用.顾名思义,触发器(Trigger)就是当某种条件满足后即完成相应逻辑功能的一部分程序组成.在当前的WPF中,Trigger一共有三种类型,它们分别是: (1)属性触发器:其对应的类是Trigger.它在特定关联属性发生变化时被触发. (2)数据触发器:其对应的类是DataTrigg

WPF中使用文件浏览对话框的几种方式

原文:WPF中使用文件浏览对话框的几种方式 WPF本身并没有为我们提供文件浏览的控件, 也不能直接使用Forms中的控件,而文件浏览对话框又是我们最常用的控件之一. 下面是我实现的方式 方式1: 使用win32控件OpenFileDialog ? 1 2 3 4 5 6 7 Microsoft.Win32.OpenFileDialog ofd = new Microsoft.Win32.OpenFileDialog(); ofd.DefaultExt = ".xml"; ofd.Fil

wpf 中如何实现combobox 下拉效果,下拉的选择面板中一行有多个选项

问题描述 本人初次接触Wpf对wpf不太熟.请问一下如图中类似combobox有着,但是选择面板里面却有多个选项横着排列的效果在wpf中如何实现啊,有现成的控件么,还是要借助第三方控件呀,麻烦懂的,有了解的帮我一下,谢谢!如果看不到图片可以点击链接看类似类别,颜色,尺码这样的下拉效果.谢谢! 解决方案 解决方案二:http://www.hollisterco.cn/zh_CN/%E5%A5%B3%E7%94%9F-%E5%8C%BA-%E6%B3%B3%E8%A3%85?icmp=ICT:SUM

knockoutjs动态加载外部的file作为component中的template数据源的实现方法_javascript技巧

玩过knockoutjs的都知道,有一个强大的功能叫做component,而这个component有个牛逼的地方就是拥有自己的viewmodel和template,比如下面这样: ko.components.register('message-editor', { viewModel: function(){}, template:"" }); 很显然,viewmodel就是function函数区,而template就是模板区,然后通过register函数将component注册到kn

WPF中listbox点击时怎么让整个背景不变色?

问题描述 WPF中listbox点击时,整个背景变成蓝色,怎么让整个背景不变色,只是让单个模块获取焦点? 解决方案 解决方案二:我也碰到了同样问题.救答案.解决方案三:模板应该能解决你的问题解决方案四:重写模板解决方案五:<Windowxmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml&