WPF中有三大模板ControlTemplate,ItemsPanelTemplate,DataTemplate.
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,它专门对TreeViewItem 或 MenuItem的一些数据对象的绑定。
以下内容来自:http://www.cnblogs.com/zhouyinhui/archive/2007/03/30/694388.html 周银辉
在WPF中我们可以为自己的数据定制显示方式,也就是说虽然某数据数据是一定的,但我们可以做到让它的表现方式多种多样,比如一个时间,在以前我们一般使用一个字符串(比如“12:03”)来显示,但我们为什么就不能显示一个小时钟呢,其实这更合乎情理,利用WPF中的数据模板技术随意并轻松地表现你的数据.
数据模板适用于Content Control类控件与Items Control类控件.
我们假设有如下一个类
1 using System; 2 3 namespace Demo 4 { 5 public class People 6 { 7 private string name; 8 9 private string photo; 10 11 public People(string name, string photo) 12 { 13 this.name = name; 14 this.photo = photo; 15 } 16 17 public string Name 18 { 19 get 20 { 21 return this.name; 22 } 23 set 24 { 25 this.name = value; 26 } 27 } 28 29 public string Photo 30 { 31 get 32 { 33 return this.photo; 34 } 35 set 36 { 37 this.photo = value; 38 } 39 } 40 } 41 }
如果在我们的软件中有一个列表控件ListBox来显示一个由多个人组成的列表,在.net 3.0以前我们可能就只能用文本来列出人的姓名而已,或者花不少的精力来重写列表控件以便在列表中在显示人名的同时显示照片.
参考以下代码:
1 <ListBox x:Name="ListBox_PeopleList" ItemTemplate="{StaticResource MyTemplate}" />
我们定义了一个ListBox,并将其ItemTemplate制定为我们自定义的MyTemplate,也就是说列表项将按照MyTemplate制定的方式来显示列表内容。
为了能在XAML中使用我们的People类,我们需要将其名字空间引入,参考以下代码:
下面的代码来定义我们的MyTemplate模板,以便告诉我们的列表如何来显示他的项目:
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>
注意到这个数据模板实际上在干什么:它定义了People类型对象的表现方式,在这里是显示People的照片并在照片的右方显示姓名。
以后我们需要People对象按这种方式展示给用户的时候,我们只要将该数据模板指定给要显示People对象的那个控件就可以了。
比如
1 <ListBox x:Name="ListBox_PeopleList" ItemTemplate="{StaticResource MyTemplate}" />
就告诉我们的列表控件按照MyTemplate定义的方式来显示其项目。
呵呵,这样是不是比以前Code方式来打造一个个性列表控件来得更方便。