[翻译]Templates in WPF
2015-09-05 18:39
423 查看
(本文翻译自c-sharpcorner上的关于Template的文章,原文地址:http://www.c-sharpcorner.com/UploadFile/mahesh/templates-in-wpf/。)
WPF中有以下三种模板:
Control Template
Items Panel Template
Data Template
Control Template
控件的ControlTemplate定义了控件的外观。我们可以通过简单的改变控件的ControlTemplate来改变或定义控件的新外观。当你写自己的控件时ControlTemplate更加有用。你可以定义控件的默认外观。例如,一个WPF Button控件拥有矩形布局,但通过ControlTemplates你可以构建一个拥有圆形布局的定制的Button并且当你鼠标至于其上或点击它时改变它的颜色。
XAML中的ControlTemplate元素在设计时(design-time)定义了一种ControlTemplate。模板通常使用FrameworkElement的Resources属性被定义为资源。下面的代码段提供了为Button元素定义ControlTemplate模板的语法。
现在,想象我们需要创建图1中的圆形按钮,按钮的外圆与内圆有不同的颜色,当鼠标至于其上(mouse over)或者按下按钮时,按钮的背景颜色改变。
图1
以下代码段创建了一个ControlTemplate并添加了Grid作为ControlTemplate的内容(content)。现在,无论你将什么内容放到ControlTemplate里,你的控件外观都会是定义的那个样子。如你所见,下面的代码段中,我们添加两个半径和颜色不同的内含Grid的椭圆。
下面的代码段创建了一个Button元素并把它的模板设置为上述代码创建的ControlTemplate。
最后输出生成了图1中的按钮。
TargetType Property
TargetType属性限制了能够使ControlTemplate应用于其上的元素的类型。以下代码段确保RoundButtonTemplate只可以被应用在Button元素上。
ControlTemplate Triggers
现在可以添加一些很酷的特征到这个控件上。我们可以在鼠标至于其上(mouse over)或者按下按钮的时候驱动Button控件。当鼠标覆盖Button时我们改变它的背景颜色,当按下Button时我们减小它的尺寸。
ControlTemplate的Trigger属性负责处理这些事件。以下代码段添加了Button的IsMouseOver和IsPressed事件的Trigger。在一个IsMouseOver事件中,我们改变Button内圆的颜色。在一个IsPressed事件中,我们改变内圆的宽度和高度,并改变外圆的颜色填充。
如下代码段所示,我改变了椭圆的Fill属性的一些代码,并使用gradient brushe填充他们。
新的按钮如图2所示,如果你将鼠标置于其上(mouse over),你将看到内圆的背景颜色变为绿色,如图3所示。
图2
如果按下按钮,你将会看到外圆的背景颜色变为灰色,内圆的宽度和高度减小。
图3
ItemsPanelTemplate
在前面的示例中,我们看到了Resource中的Style元素如何被用来组织元素的多个属性并使用元素的Style属性设置它们。然而,Style的功能并没有在这里结束。Style不仅可以用来组织和共享属性,而且可以用来组织和共享任何FrameworkElement或FrameworkContentElement上的资源和事件处理程序(resources and event handlers)。
Style是一种Resource,它和其他任何Resource的使用方法一致,Style可以应用于当前元素、父元素、根元素,甚至在应用程序级别上。如果风格类似于任何其他资源范围。资源查找流程(Resource lookup process)会首先查找本地的Style,如果没有找到,它将遍历逻辑树中的父元素。最后,资源查找流程(Resource lookup process)将寻找应用程序和主题中的Style。
XAML中的Style元素代表了一种Style。典型的Style元素的定义如下:
从Style的定义中可以看到,Style中有多个Setter元素。每个Setter由一个属性(property)和一个值(value)组成。property的值是该属性的名称,value是将使用该Style的元素的property的实际值。
Setters Property
类型(Type)的Setters property代表了Setter和EventSetter对象的集合。下面的代码段使用Setters property 并添加了Setter和EventSetter对象。
下面代码段通过在设计时(design-time)使用XAML语言添加一些Setter元素和一个EventSetter元素来设置Setters property。
WPF中有以下三种模板:
Control Template
Items Panel Template
Data Template
Control Template
控件的ControlTemplate定义了控件的外观。我们可以通过简单的改变控件的ControlTemplate来改变或定义控件的新外观。当你写自己的控件时ControlTemplate更加有用。你可以定义控件的默认外观。例如,一个WPF Button控件拥有矩形布局,但通过ControlTemplates你可以构建一个拥有圆形布局的定制的Button并且当你鼠标至于其上或点击它时改变它的颜色。
XAML中的ControlTemplate元素在设计时(design-time)定义了一种ControlTemplate。模板通常使用FrameworkElement的Resources属性被定义为资源。下面的代码段提供了为Button元素定义ControlTemplate模板的语法。
<Grid> <Grid.Resources> <ControlTemplate x:Key="RoundButtonTemplate" /> </Grid.Resources> </Grid>
现在,想象我们需要创建图1中的圆形按钮,按钮的外圆与内圆有不同的颜色,当鼠标至于其上(mouse over)或者按下按钮时,按钮的背景颜色改变。
图1
以下代码段创建了一个ControlTemplate并添加了Grid作为ControlTemplate的内容(content)。现在,无论你将什么内容放到ControlTemplate里,你的控件外观都会是定义的那个样子。如你所见,下面的代码段中,我们添加两个半径和颜色不同的内含Grid的椭圆。
<Grid.Resources> <ControlTemplate x:Key="RoundButtonTemplate" > <Grid> <Ellipse Width="100" Height="100" Name="ButtonBorder" Fill="OrangeRed" /> <Ellipse Width="80" Height="80" Fill="Orange" /> </Grid> </ControlTemplate> </Grid.Resources>
下面的代码段创建了一个Button元素并把它的模板设置为上述代码创建的ControlTemplate。
<Button Template="{StaticResource RoundButtonTemplate}" >OK</Button>
最后输出生成了图1中的按钮。
TargetType Property
TargetType属性限制了能够使ControlTemplate应用于其上的元素的类型。以下代码段确保RoundButtonTemplate只可以被应用在Button元素上。
<ControlTemplate x:Key="RoundButtonTemplate" TargetType="{x:Type Button}" >
ControlTemplate Triggers
现在可以添加一些很酷的特征到这个控件上。我们可以在鼠标至于其上(mouse over)或者按下按钮的时候驱动Button控件。当鼠标覆盖Button时我们改变它的背景颜色,当按下Button时我们减小它的尺寸。
ControlTemplate的Trigger属性负责处理这些事件。以下代码段添加了Button的IsMouseOver和IsPressed事件的Trigger。在一个IsMouseOver事件中,我们改变Button内圆的颜色。在一个IsPressed事件中,我们改变内圆的宽度和高度,并改变外圆的颜色填充。
<ControlTemplate.Triggers> <Trigger Property="Button.IsMouseOver" Value="True"> <Setter TargetName="InnerCircle" Property="Fill" Value="LightGreen" /> </Trigger> <Trigger Property="Button.IsPressed" Value="True"> <Setter TargetName="InnerCircle" Property="Width" Value="60" /> <Setter TargetName="InnerCircle" Property="Height" Value="60" /> <Setter TargetName="OuterCircle" Property="Fill" Value="Gray" /> </Trigger> </ControlTemplate.Triggers>
如下代码段所示,我改变了椭圆的Fill属性的一些代码,并使用gradient brushe填充他们。
<Ellipse Width="100" Height="100" Name="OuterCircle" > <Ellipse.Fill> <LinearGradientBrush StartPoint="0,0" EndPoint="0,0.5"> <GradientStop Offset="0" Color="OrangeRed" /> <GradientStop Offset="1" Color="Orange" /> </LinearGradientBrush> </Ellipse.Fill> </Ellipse> <Ellipse Width="80" Height="80" Name="InnerCircle"> <Ellipse.Fill> <LinearGradientBrush StartPoint="0,0" EndPoint="0,1"> <GradientStop Offset="0" Color="White" /> <GradientStop Offset="1" Color="OrangeRed" /> </LinearGradientBrush> </Ellipse.Fill> </Ellipse>
新的按钮如图2所示,如果你将鼠标置于其上(mouse over),你将看到内圆的背景颜色变为绿色,如图3所示。
图2
如果按下按钮,你将会看到外圆的背景颜色变为灰色,内圆的宽度和高度减小。
图3
ItemsPanelTemplate
在前面的示例中,我们看到了Resource中的Style元素如何被用来组织元素的多个属性并使用元素的Style属性设置它们。然而,Style的功能并没有在这里结束。Style不仅可以用来组织和共享属性,而且可以用来组织和共享任何FrameworkElement或FrameworkContentElement上的资源和事件处理程序(resources and event handlers)。
Style是一种Resource,它和其他任何Resource的使用方法一致,Style可以应用于当前元素、父元素、根元素,甚至在应用程序级别上。如果风格类似于任何其他资源范围。资源查找流程(Resource lookup process)会首先查找本地的Style,如果没有找到,它将遍历逻辑树中的父元素。最后,资源查找流程(Resource lookup process)将寻找应用程序和主题中的Style。
XAML中的Style元素代表了一种Style。典型的Style元素的定义如下:
<Style> Setters </Style>
从Style的定义中可以看到,Style中有多个Setter元素。每个Setter由一个属性(property)和一个值(value)组成。property的值是该属性的名称,value是将使用该Style的元素的property的实际值。
Setters Property
类型(Type)的Setters property代表了Setter和EventSetter对象的集合。下面的代码段使用Setters property 并添加了Setter和EventSetter对象。
下面代码段通过在设计时(design-time)使用XAML语言添加一些Setter元素和一个EventSetter元素来设置Setters property。
<Grid> <Grid.Resources> <Style TargetType="{x:Type Button}"> <Setter Property="Width" Value="200"/> <Setter Property="Height" Value="30"/> <Setter Property="Foreground" Value="White"/> <Setter Property="Background" Value="DarkGreen"/> <Setter Property="BorderBrush" Value="Black"/> <EventSetter Event="Click" Handler="Button1_Click"/> </Style> </Grid.Resources> <Button>Click me</Button> </Grid>
相关文章推荐
- POJ 2912 Rochambeau(枚举 + 偏移量并查集)
- Java学习笔记之Pattern类的用法详解(正则表达式)
- 有没有被UGUI的锚点萌了一脸~。~
- Windows API Sets
- 如何克服在意别人的看法
- 使用Junit工具进行单元测试
- JAVA虚拟机(4)笔记
- Dos命令初阶--文件拷贝
- 厌倦了工作,可以这样调整
- 【JAVASCRIPT】React入门学习-文本渲染
- ccf+在于枚举时h的巧妙
- 条款24 若所有参数皆需类型转换,请为此采用non-member函数
- 从薪资800一路爬到月薪过万,全靠这6条
- UVA10596欧拉回路加特判
- 【Python基础】作用域
- Military Phonetic Alphabet
- C文件
- 我的征途是星辰大海
- Java虚拟机(3)自动内存管理机制
- Nginx+Lua+Redis整合实现高性能API接口 - 网站服务器 - LinuxTone | 运维专家网论坛 - 最棒的Linux运维与开源架构技术交流社区! - Powered by Discuz!