WPF模板概述(数据模板)

摘要:
WPF中有三大模板ControlTemplate,ItemsPanelTemplate,DataTemplate.其中ControlTemplate和ItemsPanelTemplate是控件模板,DataTemplate是数据模板,他们都派生自FrameworkTemplate抽象类。注意到这个数据模板实际上在干什么:它定义了People类型对象的表现方式,在这里是显示People的照片并在照片的右方显示姓名。以后我们需要People对象按这种方式展示给用户的时候,我们只要将该数据模板指定给要显示People对象的那个控件就可以了。

WPF中有三大模板ControlTemplate,ItemsPanelTemplate,DataTemplate.

其中ControlTemplate和ItemsPanelTemplate是控件模板,DataTemplate是数据模板,他们都派生自FrameworkTemplate抽象类。

1、ControlTemplate

ControlTemplate:控件模板主要有两个重要属性:VisualTree内容属性和Triggers触发器。所谓VisualTree(视觉树),就是呈现我们所画的控件。Triggers可以对我们的视觉树上的元素进行一些变化。一般用于单内容控件。

2、ItemsPanelTemplate

ItemsPanelTemplate在MSDN的解释是:ItemsPanelTemplate 指定用于项的布局的面板。GroupStyle具有一个类型为 ItemsPanelTemplate 的Panel属性。ItemsControl类型具有一个类型为ItemsPanelTemplate 的ItemsPanel属性。

我们先讲ItemTemplate。它一般用在多个内容控件的模板。比如ListBox。

3、DataTemplate和HierarchicalDataTemplate

DataTemplate就是显示绑定数据对象的模板。
HierarchicalDataTemplate继承于DataTemplate,它专门对TreeViewItemMenuItem的一些数据对象的绑定。

以下内容来自:http://www.cnblogs.com/zhouyinhui/archive/2007/03/30/694388.html 周银辉

在WPF中我们可以为自己的数据定制显示方式,也就是说虽然某数据数据是一定的,但我们可以做到让它的表现方式多种多样,比如一个时间,在以前我们一般使用一个字符串(比如“12:03”)来显示,但我们为什么就不能显示一个小时钟呢,其实这更合乎情理,利用WPF中的数据模板技术随意并轻松地表现你的数据.
数据模板适用于Content Control类控件与Items Control类控件.
我们假设有如下一个类

WPF模板概述(数据模板)第1张WPF模板概述(数据模板)第2张View Code
1 usingSystem;
2 
3 namespaceDemo
4 {
5     public classPeople
6 {
7         private stringname;
8 
9         private stringphoto;
10 
11         public People(string name, stringphoto)
12 {
13             this.name =name;
14             this.photo =photo;
15 }
16 
17         public stringName
18 {
19             get
20 {
21                 return this.name;
22 }
23             set
24 {
25                 this.name =value;
26 }
27 }
28 
29         public stringPhoto
30 {
31             get
32 {
33                 return this.photo;
34 }
35             set
36 {
37                 this.photo =value;
38 }
39 }
40 }
41 }
这个类很简单地表示了一个人,他的姓名和他的照片(路径)
如果在我们的软件中有一个列表控件ListBox来显示一个由多个人组成的列表,在.net 3.0以前我们可能就只能用文本来列出人的姓名而已,或者花不少的精力来重写列表控件以便在列表中在显示人名的同时显示照片.
参考以下代码:
WPF模板概述(数据模板)第3张WPF模板概述(数据模板)第4张View Code
1 <ListBox x:Name="ListBox_PeopleList" ItemTemplate="{StaticResource  MyTemplate}" />

我们定义了一个ListBox,并将其ItemTemplate制定为我们自定义的MyTemplate,也就是说列表项将按照MyTemplate制定的方式来显示列表内容。

这样我们就可以发挥我们的想像力来自定义MyTemplate
为了能在XAML中使用我们的People类,我们需要将其名字空间引入,参考以下代码:
xmlns:demo="clr-namespace:Demo"
其中Demo是我们的People类所在的名字空间,以后可以使用demo来表示这个名字空间了.
下面的代码来定义我们的MyTemplate模板,以便告诉我们的列表如何来显示他的项目:
WPF模板概述(数据模板)第5张WPF模板概述(数据模板)第6张View Code
1 <Window.Resources>        
2     <!--列表模板-->
3     <DataTemplate x:Key="MyTemplate" DataType="{x:Type demo:People}">
4       <Grid VerticalAlignment="Center" HorizontalAlignment="Center" Margin="4,4,4,4" >
5         <Grid.ColumnDefinitions>
6           <ColumnDefinition Width="Auto"/>
7           <ColumnDefinition Width="Auto"/>
8         </Grid.ColumnDefinitions>
9         <Image Source="{Binding Photo}" Width="50" Height="50" Grid.Column="0" Grid.RowSpan="1"/>
10         <TextBlock Text="{Binding Name}" Grid.Column="1" Grid.ColumnSpan="1" HorizontalAlignment="Center" VerticalAlignment="Center"/>
11       </Grid>
12     </DataTemplate>
13 </Window.Resources>
我们将模板定义为窗口的资源,资源保存在一个资源字典中的,x:Key="MyTemplate"表示其在资源字典中的键,DataType="{x:Typedemo:People}"表示该数据模板针对的数据类型是demo名字空间下的People类,接下来在Gird中我们定义了该数据模板的视觉树,这也是我们的工作重心,即该视觉树定义了如何显示我们的数据。我们使用了一个Image控件并将其Source绑定到People的Photo属性上,这样以便在该Imag控件上显示照片,然后在Image的右边我们使用一个TextBlock控件来显示人名(将People的Name属性绑定到TextBlock的Text属性上)。
注意到这个数据模板实际上在干什么:它定义了People类型对象的表现方式,在这里是显示People的照片并在照片的右方显示姓名。
以后我们需要People对象按这种方式展示给用户的时候,我们只要将该数据模板指定给要显示People对象的那个控件就可以了。
比如
WPF模板概述(数据模板)第7张WPF模板概述(数据模板)第8张View Code
1 <ListBox x:Name="ListBox_PeopleList" ItemTemplate="{StaticResource  MyTemplate}" />

就告诉我们的列表控件按照MyTemplate定义的方式来显示其项目。


呵呵,这样是不是比以前Code方式来打造一个个性列表控件来得更方便。

免责声明:文章转载自《WPF模板概述(数据模板)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇EF的命令行指令算法训练 安慰奶牛下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

2019-11-29-WPF-禁用实时触摸

title author date CreateTime categories WPF 禁用实时触摸 lindexi 2019-11-29 10:20:52 +0800 2018-5-4 21:0:38 +0800 WPF 触摸 微软想把 WPF 作为 win7 的触摸好用的框架,所以微软做了很多特殊的兼容。为了获得真实的触摸消息,微软提供了...

WPF知识点全攻略06- WPF逻辑树(Logical Tree)和可视树(Visual Tree)

介绍概念之前,先来分析一段代码: xaml代码如下: <Window x:Class="WpfApp1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.micros...

WPF 制作圆角按钮

在程序对应坐置插入以下代码,或是先拖一个按钮控件到窗体中,再替换对应的代码。 修改CornerRadius="18,3,18,3" 就可以改变圆角大小 按钮效果: <Button Content="Button" HorizontalAlignment="Left" Margin="19,10,0,0" VerticalAlignment="Top...

将WPF UI单元复制到“.NET研究”剪贴板 狼人:

大家在日常工作中应该遇到过这样的问题:需要对应用程序界面进行截屏操作,然后将截屏内容拷贝到其他文档中使用。通常情况下我们会使用一些截屏软件或者“Ctrl+PrtSc ”,本篇将介绍如何在WPF 程序中将UI 单元直接以图片形式复制到剪贴板,以达到为应用程序界面制作快照(Snapshot)的功能。 以我之前做过的一个“WPF 员工卡”的文章为例。首先,要为程...

WPF中如何为ItemsControl添加ScrollViewer并显示ScrollBar

    今天在开发的过程中突然碰到了一个问题,本来的意图是想当ItemsControl中加载的Item达到一定数量时,会出现ScrollViewer并出现垂直的滚动条,但是实际上并不能够达成目标,对于熟手来说这个问题非常简单,但是如果不了解WPF的模板的原理,可能并不清楚这些,这里举出一个例子来论证。 <Window x: xmln...

wpf 逻辑树与可视化树

XAML天生就是用来呈现用户界面的,这是由于它具有层次化的特性。在WPF中,用户界面由一个对象树构建而成,这棵树叫作逻辑树。逻辑树的概念很直观,但是为什么要关注它呢?因为几乎WPF的每一方面(属性、事件、资源等)都有与逻辑树相关联的行为。例如,属性值有时会沿着树自动传递给子元素,而触发的事件可以自底向上或自顶向下遍历树。 与逻辑树类似的一个概念是可视树。可...