(本文翻译自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 <Grid>
2 <Grid.Resources>
3     <ControlTemplate x:Key="RoundButtonTemplate" />
4 </Grid.Resources>
5 </Grid>

  现在,想象我们需要创建图1中的圆形按钮,按钮的外圆与内圆有不同的颜色,当鼠标至于其上(mouse over)或者按下按钮时,按钮的背景颜色改变。

    图1

以下代码段创建了一个ControlTemplate并添加了Grid作为ControlTemplate的内容(content)。现在,无论你将什么内容放到ControlTemplate里,你的控件外观都会是定义的那个样子。如你所见,下面的代码段中,我们添加两个半径和颜色不同的内含Grid的椭圆。

1 <Grid.Resources>
2     <ControlTemplate x:Key="RoundButtonTemplate" >
3         <Grid>
4       <Ellipse Width="100" Height="100" Name="ButtonBorder"
5                   Fill="OrangeRed"  />
6             <Ellipse Width="80" Height="80" Fill="Orange"  />
7         </Grid>
8     </ControlTemplate>
9 </Grid.Resources>  

下面的代码段创建了一个Button元素并把它的模板设置为上述代码创建的ControlTemplate。

1 <Button Template="{StaticResource RoundButtonTemplate}" >OK</Button>  

最后输出生成了图1中的按钮。

TargetType Property

  TargetType属性限制了能够使ControlTemplate应用于其上的元素的类型。以下代码段确保RoundButtonTemplate只可以被应用在Button元素上。

1 <ControlTemplate x:Key="RoundButtonTemplate" TargetType="{x:Type Button}" >  

ControlTemplate Triggers

  现在可以添加一些很酷的特征到这个控件上。我们可以在鼠标至于其上(mouse over)或者按下按钮的时候驱动Button控件。当鼠标覆盖Button时我们改变它的背景颜色,当按下Button时我们减小它的尺寸。

ControlTemplate的Trigger属性负责处理这些事件。以下代码段添加了Button的IsMouseOver和IsPressed事件的Trigger。在一个IsMouseOver事件中,我们改变Button内圆的颜色。在一个IsPressed事件中,我们改变内圆的宽度和高度,并改变外圆的颜色填充。

 1 <ControlTemplate.Triggers>
 2     <Trigger Property="Button.IsMouseOver" Value="True">
 3         <Setter TargetName="InnerCircle" Property="Fill" Value="LightGreen" />
 4     </Trigger>
 5     <Trigger Property="Button.IsPressed" Value="True">
 6         <Setter TargetName="InnerCircle" Property="Width" Value="60" />
 7         <Setter TargetName="InnerCircle" Property="Height" Value="60" />
 8         <Setter TargetName="OuterCircle" Property="Fill" Value="Gray" />
 9      </Trigger>
10 </ControlTemplate.Triggers> 

  如下代码段所示,我改变了椭圆的Fill属性的一些代码,并使用gradient brushe填充他们。

 1 <Ellipse Width="100" Height="100" Name="OuterCircle" >
 2     <Ellipse.Fill>
 3         <LinearGradientBrush StartPoint="0,0" EndPoint="0,0.5">
 4             <GradientStop Offset="0" Color="OrangeRed"  />
 5             <GradientStop Offset="1" Color="Orange" />
 6         </LinearGradientBrush>
 7     </Ellipse.Fill>
 8 </Ellipse>
 9 <Ellipse Width="80" Height="80" Name="InnerCircle">
10     <Ellipse.Fill>
11         <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
12             <GradientStop Offset="0" Color="White" />
13             <GradientStop Offset="1" Color="OrangeRed" />
14         </LinearGradientBrush>
15     </Ellipse.Fill>
16 </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元素的定义如下:

1 <Style>
2    Setters
3 </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。

 1 <Grid>
 2     <Grid.Resources>
 3         <Style TargetType="{x:Type Button}">
 4             <Setter Property="Width" Value="200"/>
 5             <Setter Property="Height" Value="30"/>
 6             <Setter Property="Foreground" Value="White"/>
 7             <Setter Property="Background" Value="DarkGreen"/>
 8             <Setter Property="BorderBrush" Value="Black"/>
 9
10             <EventSetter Event="Click" Handler="Button1_Click"/>
11         </Style>
12     </Grid.Resources>
13
14     <Button>Click me</Button>
15 </Grid> 

转载于:https://www.cnblogs.com/mark-tubu/p/4783665.html

[翻译]Templates in WPF相关推荐

  1. 王洪超:WPF催熟整个软件生态链

    王宏超:WPF催熟整个软件生态链 推荐阅读: 1.众星捧月--ASP.NET之父等力荐的一本书 2.WPF圣经--<WPF揭秘> 3.Tony Qu的<WPF揭秘>情节 200 ...

  2. WPF数据绑定(1-简单数据绑定)

    2019独角兽企业重金招聘Python工程师标准>>> 附WPF书籍推荐: 1.不要为书籍经销商的炒作蒙蔽,国内翻译的<WPF揭秘>被褒扬成经典,其实我认为该书浅尝则止, ...

  3. 【ASP.NET Web API教程】3.3 通过WPF应用程序调用Web API(C#)

    注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的内容. 3.3 Calling a Web API From a WPF Application ...

  4. 分享Silverlight/WPF/Windows Phone/HTML5一周学习导读(1月16日-2月5日)

    分享Silverlight/WPF/Windows Phone/HTML5一周学习导读(1月16日-2月5日) 本周Silverlight学习资源更新 WIn2003部署Silverlight coo ...

  5. Symfony学习笔记之翻译组件-----translation总结

    "过际化"(internationalization,常被简写为i18n),是指将字符串和其他一些具有区域特征的片段,从你的程序中提取(abstract)出来,并基于用户所在区域( ...

  6. 开源WPF控件库-AdonisUI

    原文:https://github.com/benruehl/adonis-ui 翻译:沙漠尽头的狼(谷歌翻译加持) 用于 WPF 应用程序的轻量级 UI 工具包,提供经典和增强的 Windows 视 ...

  7. 分享Silverlight/WPF/Windows Phone一周学习导读(11月21日-11月27日)

    分享Silverlight/WPF/Windows Phone一周学习导读(11月21日-11月27日) 本周Silverlight学习资源更新 Silverlight 利用Telerik导出到Wor ...

  8. 迈向更小的.NET 4-有关客户端配置文件和下载.NET的详细信息

    NOTE: All this info is for programmers/developers. If you just If you want .NET just to run stuff, j ...

  9. 博客园电子月刊[第一期]

    本版改进: 简化布局,使之更整洁. 由于客户端邮件不支持图片,去除了一些图片. 由于衡量文章标准不统一,去掉了推荐指数. 规范了文章的分类标准. 增加了作者博客链接,增强互动性. 提供订阅和退订服务. ...

  10. Implementing the 3DVIA Composer Player ActiveX in Windows Presentation Foundation

    2019独角兽企业重金招聘Python工程师标准>>> In this post I want to address a technological issue related to ...

最新文章

  1. 直击阿里百度岗!助力求职,拿不到offer全额退款保证|第五期人工智能与推荐系统/NLP/CV专业方向...
  2. react-antd项目中重新npm  install  导致自动升级antd版本,引发的样式问题
  3. 快速了解什么是自然语言处理
  4. 利用sqoop将hive数据导入导出数据到mysql
  5. 地铁上怎么那么多钢管女郎?
  6. 教程视图Android教程(十三)-- Activity间的切换
  7. 分布式文件系统HDFS 学习指南
  8. 获取工程的exe文件的所在目录
  9. 线下见面会,下一站定啦!
  10. jq ui-selectable中click单击事件,dblclick双击事件无效
  11. http-server 简介
  12. 刀塔传奇战斗系统分析
  13. 如何做 ASO 优化?
  14. php8网站,教你从零搭建php8环境
  15. 可插拨的观感体系结构(一)
  16. 基于32位版CentOS6配置符合HA模式的CDH5.7.0的Hadoop+Yarn+HBase集群
  17. 计算机组成原理经典复习题集锦(附答案)
  18. unity5.0 添加图片纹理
  19. vim全选,全部复制,全部删除快捷键
  20. Eclipse汉化教程(详细图解)

热门文章

  1. Android 手势导航(Launcher3 部分)
  2. 记录String.valueOf()和toString()注意问题
  3. ElementUI Collapse 折叠面板
  4. 酷狗音乐、QQ音乐、网易云音乐API
  5. 超声波清洗机是什么?
  6. Processing鼠标键盘
  7. Linux服务器间如何进行文件同步
  8. 关闭计算机休眠文件,电脑垃圾清理关闭休眠文件夹hiberfil.sys
  9. C#Skip和Take的用法
  10. TC397 EVADC