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 ...
随机推荐
- 简论:int i = 0
int i =0; 或许这就是i和0的缘分吧...
- spring - 自定义注解
本自定义注解的作用:用于控制类方法的调用,只有拥有某个角色时才能调用. java内置注解 1.@Target 表示该注解用于什么地方,可能的 ElemenetType 参数包括: ElemenetTy ...
- Java中的向上转型和向下转型
首先要明白一点向上转型和向下转型他们都是建立在继承的基础上. 一.向上转型 子类到父类的转换通常称作向上转型,通俗的说就是定义父类对象指向子类对象. 下面通过一个例子来深入理解向上转型. //定义一个 ...
- [UOJ#131][BZOJ4199][NOI2015]品酒大会 后缀数组 + 并查集
[UOJ#131][BZOJ4199][NOI2015]品酒大会 试题描述 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个 ...
- 大数据之ETL设计详解
ETL是BI项目最重要的一个环节,通常情况下ETL会花掉整个项目的1/3的时间,ETL设计的好坏直接关接到BI项目的成败.ETL也是一个长期的过程,只有不断的发现问题并解决问题,才能使ETL运行效率更 ...
- 利用zabbix监控某个目录大小
近期,因为JMS的消息堆积导致ApacheMQ频率故障(消息没有被消费掉,导致其数据库达到1.2G,JMS此时直接挂掉),很是郁闷!刚好自 己在研究zabbix.既然zabbix如此强大,那么它可以监 ...
- js:判断对象是否为空
var list = []; var param = {}; ....... var hasProp = false; for (var prop in param){ hasProp = true; ...
- Cocos2d 学习资料推荐
总算找到了一本介绍cocos2d的好书,注意,不是cocos2d-x!这本书叫 <cocos2d 权威指南> 定价99元,淘宝60多元,详细介绍了cocos2d的各个方面!不过你需要有oc ...
- kindeditor的简单使用
上传到云: 一.引入kindeditor <%@ page language="java" contentType="text/html; charset=UTF- ...
- block引发的陷阱
block在项目的开发中使用时非常频繁的,苹果官方也极力推荐使用block.其实,究其本质,block就是指向结构体的指针(可利用运行时机制查看底层生成的c代码).然而在使用block时会存在很多陷阱 ...