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. Fifth scrum meeting - 2015/10/30

    概述 从昨天开始,我们的开发工作终于进入了正轨,由于之前没有mooc服务器API接口,一些工作无法进行. 因为我们团队开始开发较晚,因此我们将开发阶段的截至时间定为了下周五,测试阶段则压缩为下周周六和 ...

  2. Ubuntu 16.04 下安装Firefox的Flash插件

    在ubuntu系统环境下面打开优酷视频,发现无法播放视频.Adobe Flash Player 是一款轻量级浏览器插件,具有丰富的 Internet 应用运行时间,提供持续的迷人用户体验.绝妙的音频/ ...

  3. 他们在军训,我在搞 OI(四)

    (怎么自动变成两天一更了?) ——因为我菜啊 T_T Day 5 今天上午刷得爽啊!5 道 NOIP,前四题直接 1A,然而最后一题还是 WA 了一发才 A... 第一题是个简单的贪心,题意大概是 n ...

  4. Ubuntu 16.04 安装 VMware-Workstation-12

    以前一直使用 Ubuntu + Virtaulbox ,最近测试了 VMware-Workstation-9,性能超过 Virtaulbox-4.2.x,下面是详细步骤: 1 首先准备一个Ubuntu ...

  5. Objective-C中的instancetype和id区别

    目录(?)[-] 有一个相同两个不同相同 Written by Mattt Thompson on Dec 10th 2012 一什么是instancetype 二关联返回类型related resu ...

  6. RPM软件包管理的查询功能

    以后大家升级rpm包的时候,不要用Uvh了! 我推荐用Fvh 前者会把没有安装过得包也给装上,后者只会更新已经安装的包   总结:未安装的加上小写p,已安装的不需要加p   查询q    rpm {- ...

  7. 2.2 编程之美--不要被阶乘吓到[zero count of N factorial]

    [本文链接] http://www.cnblogs.com/hellogiser/p/zero-count-of-N-factorial.html [题目] 问题1:‍给定一个整数N,那么N的阶乘N! ...

  8. 如何让你的scrapy爬虫不再被ban

    前面用scrapy编写爬虫抓取了自己博客的内容并保存成json格式的数据(scrapy爬虫成长日记之创建工程-抽取数据-保存为json格式的数据)和写入数据库(scrapy爬虫成长日记之将抓取内容写入 ...

  9. swift 中String,Int 等类型使用注意,整理中

    swfit中的String和Int是 struct定义的,不同于NSString和NSNumber, 如果想在一个数组中同时包含String和Int,那么这个数组要声明为[Any] 而不是 [AnyO ...

  10. IOS多线程(GCD)

    简介 Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统.这建立在任务并行执行的线程池模式的基础上的.它首次 ...