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.

本文源码下载

作者:Rising Sun
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
原文链接:http://www.cnblogs.com/lxblog/archive/2012/10/16/2726826.html

WPF/Silverlight Template使用及总结(转)的更多相关文章

  1. WPF/Silverlight HierarchicalDataTemplate 模版的使用(转)

    上一篇 对Wpf/Silverlight Template 进行了总结,本篇继续上一篇,主要是介绍 HierarchicalDataTemplate 的使用方法.HierarchicalDataTem ...

  2. XData -–无需开发、基于配置的数据库RESTful服务,可作为移动App和ExtJS、WPF/Silverlight、Ajax等应用的服务端

    XData -–无需开发.基于配置的数据库RESTful服务,可作为移动App和ExtJS.WPF/Silverlight.Ajax等应用的服务端   源起一个App项目,Web服务器就一台,已经装了 ...

  3. WPF/Silverlight Layout 系统概述——Arrange(转)

    Arrange过程概述 普通基类属性对Arrange过程的影响 我们知道Measure过程是在确定DesiredSize的大小,以便Arrange过程参考这个DesiredSize,确定给MyPane ...

  4. WPF/Silverlight Layout 系统概述——Measure(转)

    前言 在WPF/Silverlight当中,如果已经存在的Element无法满足你特殊的需求,你可能想自定义Element,那么就有可能会面临重写MeasureOverride和ArrangeOver ...

  5. Mvvm Light Toolkit for WPF/Silverlight系列之搭建mvvmlight开发框架

    Mvvm Light Toolkit for WPF/Silverlight系列之搭建mvvmlight开发框架   本章节,我将通过示例介绍如何搭建mvvmlight开发环境.示例中的我会针对wpf ...

  6. WPF/Silverlight深度解决方案:(一)解锁被Storyboard束缚的关联属性

    原文 WPF/Silverlight深度解决方案:(一)解锁被Storyboard束缚的关联属性 如果您在使用WPF/Silverlight进行相关动画开发中使用了Storyboard,并对关联属性进 ...

  7. WPF/Silverlight中图形的平移,缩放,旋转,倾斜变换演示

    原文:WPF/Silverlight中图形的平移,缩放,旋转,倾斜变换演示 为方便描述, 这里仅以正方形来做演示, 其他图形从略. 运行时效果图:XAML代码:// Transform.XAML< ...

  8. WPF/Silverlight中的RichTextBox总结

    WPF/Silverlight中的RichTextBox总结   在WPF或者是在Silverlight中有个非常强大的可以编辑的容器控件RichTextBox,有的时间会采取该控件来作为编辑控件.鉴 ...

  9. MvvmLight学习篇—— Mvvm Light Toolkit for wpf/silverlight系列(导航)

    系列一:看的迷迷糊糊的 一.Mvvm Light Toolkit for wpf/silverlight系列之准备工作 二.Mvvm Light Toolkit for wpf/silverlight ...

随机推荐

  1. sql 批量更新

    利用update和select进行批量更新 UPDATE Table1 SET categoryId =(SELECT Id FROM Table2 WHERE Table1 .Id=Table2.c ...

  2. DICOM:DICOM3.0网络通信协议(续)

    转载:http://blog.csdn.net/zssureqh/article/details/44278693 题记: 近一年来一直坚持周末写博客,整理工作和闲暇之余的点点滴滴.对于新知识点.新技 ...

  3. Mysql函数集合

    Mysql提供了很多函数 提供的常用函数集合 一.数学函数 ABS(x) 返回x的绝对值 BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制) CEILING(x) 返回大于x的最小整 ...

  4. spring中context:property-placeholder/元素

    1.有些参数在某些阶段中是常量 比如 :a.在开发阶段我们连接数据库时的连接url,username,password,driverClass等 b.分布式应用中client端访问server端所用的 ...

  5. js 猜数字游戏

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. 5.django笔记之form保存表单信息,动态select

    作者:刘耀 一.使用form保存用户输入过的信息 场景:例如 如果用户注册,那么他输入n多个表单之后,那么他提交是时候,如果错误返回的时候,那么需要重新再输入表单内容.这样会影响用户体验,所以,使用f ...

  7. Codeforces 424A (思维题)

    Squats Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Submit Statu ...

  8. Linux 中文乱码问题

    弄了好久还是乱码 最终方法:进入 vim /etc/vimrc中 原先只有一个 set encoding=utf-8 fileencodings=ucs-bom,utf-8,cp936改成: let ...

  9. Linux下的ip命令,除了ifconfig还有很多

    linux的ip命令和ifconfig类似,但前者功能更强大,并旨在取代后者.使用ip命令,只需一个命令,你就能很轻松地执行一些网络管理任务.ifconfig是net-tools中已被废弃使用的一个命 ...

  10. KVM中Linux虚拟机的硬盘添加方法

    [root@cache01 ~]# df -hT Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/VolGroup-lv_roo ...