WPF/Silverlight Template使用及总结(转)
WPF/Silverlight 中的控件都有Style和Template两种属性。前者解释为样式,是用来改变控件原有属性的,比如 Button 控件的(Width,Height,Background 等等)。后者被解释为模版,用于定义控件的内部结构,可以对控件的外观和形状进行改变,比如可以把Button控件的形状由原来的矩形改变圆形。
WPF/Silverlight控件主要分为以下三类:
Control类型
– Template属性 (ControlTemplate类型)
– ContentPresenter
– ContentTemplate (DataTemplate类型)
ContentControl类型
– Template属性 (ControlTemplate类型) 继承自Control
– ContentTemplate (DataTemplate类型)
ItemsControl类型
– Template属性 (ControlTemplate类型) 继承自Control
– ItemsPanel属性 (ItemsPanelTemplate类型) 指定布局容器
– ItemTemplate属性 (DateTemplate类型) 每个Item的Template
通过上面的Control类型及Template属性,我们可以发现两种最基本Template类型,其实就是ControlTemplate和 DateTemplate。
下面通过实例,对他们进行一一介绍和总结。
1、ControlTemplate:用于描述控件本身的视觉样式和行为,一般用于单一内容控件。
举例:我们修改一个Button的Template:

<Style x:Key="LxButtonA" TargetType="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid>
<Ellipse Width="80" Height="40" HorizontalAlignment="Center" VerticalAlignment="Center">
<Ellipse.Fill>
<RadialGradientBrush>
<GradientStop Color="Green" Offset="1"/>
<GradientStop Color="White" Offset="0"/>
</RadialGradientBrush>
</Ellipse.Fill>
</Ellipse>
<TextBlock FontSize="24" HorizontalAlignment="Center" VerticalAlignment="Center" Text="Hello"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

对Button应用该样式:
<Button Style="{StaticResource LxButtonA}" Height="40" Width="80" Content="Silverlight"/>
效果如下图:

这时候,会发现,我们在Xaml中虽然对Button的Content属性赋值为“silverlight” ,但是Button并没有显示,而是显示的Template中TextBlock的Text值Hello,这是因为我们定义的ControlTemplate重写了原来Button中的Content控件,我们可以这样修改:

<Style x:Key="LxButtonB" TargetType="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid>
<Ellipse Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" HorizontalAlignment="Center" VerticalAlignment="Center">
<Ellipse.Fill>
<RadialGradientBrush>
<GradientStop Color="Green" Offset="1"/>
<GradientStop Color="White" Offset="0"/>
</RadialGradientBrush>
</Ellipse.Fill>
</Ellipse>
<!--<TextBlock FontSize="24" HorizontalAlignment="Center" VerticalAlignment="Center" Text="{TemplateBinding Content}"/>-->
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

将原来的模版中的TextBlock控件的Text属性修改为: Text="{TemplateBinding Content}",TemplateBinding 解释为模板绑定扩展是用来把原对象中的属性和模板对象中的属性联系起来
为了提高性能,我们可以用一个ControlPresenter来代替TextBlock,效果一样的。由于篇幅有限,两者的区别本文不做介绍,具体请点击这里查看。
对Button应用该样式:
<Button Style="{StaticResource LxButtonB}" Height="40" Width="80" Content="World"/>
效果如下图:

再来说说ContentTemplate属性,这个属性是ContentControl类的属性,其返回类型是DataTemplate类,它主要用于在不改变控件行为方式的基础上,只对控件的内容进行修改。

<Style x:Key="LxButtonC" TargetType="Button">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<Image Source="Image/1.png" Height="64" Width="64"/>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>

对Button应用该样式,只是对Button的Content进行了更改,其他行为方式都没有变化,效果如下图:

2、DataTemplate:用于描述控件的Content(数据对象)的视觉样式。
我们来用一个ItemsControl来进行举例,用ListBox显示一列图片,首先我们定义一个类DateItem:

public class DataItem
{
/// <summary>
/// 图片路径
/// </summary>
public string ImagePath { get; set; } /// <summary>
/// 显示文字
/// </summary>
public string ShowText { get; set; }
}

定义ListBox的样式模版并应用该样式

<Style x:Key="LxListBoxA" TargetType="ListBox">
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel>
<Image Source="{Binding ImagePath}" Height="64" Width="64" Margin="0"/>
<TextBlock Text="{Binding ShowText}" HorizontalAlignment="Center" Margin="6" />
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>

<ListBox x:Name="MyList" Style="{StaticResource LxListBoxA}"/>
对List进行绑定::
List<DataItem> DataList = new List<DataItem>();
DataList.Add(new DataItem() { ImagePath = @"Image/1.png", ShowText = "人物" });
DataList.Add(new DataItem() { ImagePath = @"Image/2.png", ShowText = "楼房" });
DataList.Add(new DataItem() { ImagePath = @"Image/3.png", ShowText = "电池" });
MyList.ItemsSource = DataList;
效果如下图所示:

对于ItemsControl类型控件,都有ItemsPanel这个属性,其返回值是ItemsPanelTemplate,用来指定控件的子项的布局样式,其他控件比如Combox,TreeView,DataGrid,TabelControl也都均有此属性。
我们可以修改上面ListBox的ItemsPanel属性,将ListBox竖排变更为横排显示:

<Style x:Key="LxListBoxA" TargetType="ListBox">
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel>
<Image Source="{Binding ImagePath}" Height="64" Width="64" Margin="0"/>
<TextBlock Text="{Binding ShowText}" HorizontalAlignment="Center" Margin="6" />
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>

显示效果如下图:

其实,在ItemsControl类型的控件中,还有个ItemContainerStyle,这又是什么属性呢?其实,他是控件子项的样式,在ListBox里即ListBoxItem的Style属性,比如我们可以在这个属性中统一设置ListBoxItem的字体字号:

<Style x:Key="LxListBoxA" TargetType="ListBox">
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel>
<Image Source="{Binding ImagePath}" Height="64" Width="64" Margin="0"/>
<TextBlock Text="{Binding ShowText}" HorizontalAlignment="Center" Margin="6" />
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style TargetType="ListBoxItem">
<Setter Property="FontSize" Value="20"/>
</Style>
</Setter.Value>
</Setter>
</Style>

运行结果如下图:

本篇通过实例对WPF/Silverlight 的ControlTemplate和DataTemplate的使用方式进行了总结,另外还有一种HierarchicalDataTemplate继承与DataTemplate,主要用于对TreeView,Menu等控件的样式绑定,下一篇我们主要介绍利用HierarchicalDataTemplate层级模版数据类型绑定Silverlight中的TreeView.
WPF/Silverlight Template使用及总结(转)的更多相关文章
- WPF/Silverlight HierarchicalDataTemplate 模版的使用(转)
上一篇 对Wpf/Silverlight Template 进行了总结,本篇继续上一篇,主要是介绍 HierarchicalDataTemplate 的使用方法.HierarchicalDataTem ...
- XData -–无需开发、基于配置的数据库RESTful服务,可作为移动App和ExtJS、WPF/Silverlight、Ajax等应用的服务端
XData -–无需开发.基于配置的数据库RESTful服务,可作为移动App和ExtJS.WPF/Silverlight.Ajax等应用的服务端 源起一个App项目,Web服务器就一台,已经装了 ...
- WPF/Silverlight Layout 系统概述——Arrange(转)
Arrange过程概述 普通基类属性对Arrange过程的影响 我们知道Measure过程是在确定DesiredSize的大小,以便Arrange过程参考这个DesiredSize,确定给MyPane ...
- WPF/Silverlight Layout 系统概述——Measure(转)
前言 在WPF/Silverlight当中,如果已经存在的Element无法满足你特殊的需求,你可能想自定义Element,那么就有可能会面临重写MeasureOverride和ArrangeOver ...
- Mvvm Light Toolkit for WPF/Silverlight系列之搭建mvvmlight开发框架
Mvvm Light Toolkit for WPF/Silverlight系列之搭建mvvmlight开发框架 本章节,我将通过示例介绍如何搭建mvvmlight开发环境.示例中的我会针对wpf ...
- WPF/Silverlight深度解决方案:(一)解锁被Storyboard束缚的关联属性
原文 WPF/Silverlight深度解决方案:(一)解锁被Storyboard束缚的关联属性 如果您在使用WPF/Silverlight进行相关动画开发中使用了Storyboard,并对关联属性进 ...
- WPF/Silverlight中图形的平移,缩放,旋转,倾斜变换演示
原文:WPF/Silverlight中图形的平移,缩放,旋转,倾斜变换演示 为方便描述, 这里仅以正方形来做演示, 其他图形从略. 运行时效果图:XAML代码:// Transform.XAML< ...
- WPF/Silverlight中的RichTextBox总结
WPF/Silverlight中的RichTextBox总结 在WPF或者是在Silverlight中有个非常强大的可以编辑的容器控件RichTextBox,有的时间会采取该控件来作为编辑控件.鉴 ...
- MvvmLight学习篇—— Mvvm Light Toolkit for wpf/silverlight系列(导航)
系列一:看的迷迷糊糊的 一.Mvvm Light Toolkit for wpf/silverlight系列之准备工作 二.Mvvm Light Toolkit for wpf/silverlight ...
随机推荐
- tar 的一个记录
今天看到群里有人在问.用tar命令备份/etc/passwd 文件提示删除/的提示 这里我要说明下,tar的打包压缩 命令: tar -zcv -f /backup/passwd.tar.gz /et ...
- php利用淘宝IP库获取用户ip地理位置
我们查ip的时候都是利用ip138查询的,不过那个有时候是不准确的,还不如自己引用淘宝的ip库来查询,这样准确度还高一些.不多说了,介绍一下淘宝IP地址库的使用. 淘宝IP地址库 淘宝公布了他们的IP ...
- 21个常用的PHP代码汇总
PHP 是目前使用最广泛的基于 Web 的编程语言,驱动着数以百万计的网站,其中也包括如 Facebook 等一些大型站点.这里收集了 21个日常开发中实用便捷的 PHP 代码,希望可以对一些 PHP ...
- Codeforces Round #FF (Div. 2) C. DZY Loves Sequences
解题报告:输入一个数列,选取一个子数列,要求最多只能改动这个子数列中的一个数,使得这个子数列是严格的升序的(严格升序没有相等的) 我的做法是,第一步把这个 数列的每个升序的子数列都找出来,然后看这些子 ...
- unity3d 截屏
原地址:http://www.cnblogs.com/88999660/archive/2013/01/21/2869747.html void OnGUI(){ if(GUI.Button(new ...
- Ubuntu 下 LAMP 的配置文件路径 转:
配置文件路径: 1>apache 的配置文件路径 /etc/apache2/apache2.conf 2>apache 网站字符编码配置路径 /etc/apache2/conf.d/c ...
- Matlab实现线性回归和逻辑回归: Linear Regression & Logistic Regression
原文:http://blog.csdn.net/abcjennifer/article/details/7732417 本文为Maching Learning 栏目补充内容,为上几章中所提到单参数线性 ...
- Maven使用常见问题整理
Maven使用常见问题整理 1.更新eclipse的classpath加入新依赖 1.在dependencyManagement里面加入包括版本在内的依赖信息,如: <dependenc ...
- MYSQL随机抽取查询 MySQL Order By Rand()效率问题
MYSQL随机抽取查询:MySQL Order By Rand()效率问题一直是开发人员的常见问题,俺们不是DBA,没有那么牛B,所只能慢慢研究咯,最近由于项目问题,需要大概研究了一下MYSQL的随机 ...
- Bulls and Cows
You are playing the following Bulls and Cows game with your friend: You write down a number and ask ...