[翻译]Templates in WPF

(本文翻译自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时我们改变它的颜色,当按下时我们减小它的尺寸。

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所示,如果你将鼠标至于其上,你将看到内圆的背景颜色变为绿色,如图3所示。

    图2

如果按下按钮,你将会看到外圆的背景颜色变为灰色,内圆的宽度和高度减小。

    图3

初学WPF,英语水平有限,不足之处请批评指正。

时间: 2024-11-10 10:46:53

[翻译]Templates in WPF的相关文章

Introduction to WPF Templates(WPF模板简介)

Introduction(简介) Windows Presentation Foundation allows the developer to completely change the look and feel of the controls. This is accomplished by using Control Templates. It means you can render your Button as an Ellipse which when hovered will c

【翻译】基于WPF的微软PRISM5.0库的开发者指导手册

Developer's Guide to Microsoft Prism Library 5.0 for WPF Prism 提供以例子和文档形式的指导,帮助你可以轻易的设计和构造丰富的,灵活的和易于维护的Windows Presentation Foundation(WPF)桌面应用.Prism类库所使用的设计模式体现了架构设计原则的重要性,例如关注分离和松耦合,这样你可以把独立的松耦合组件简单无缝的集合在整个应用中. 这篇文章会联系源码和文档来预览整个Prism. 入门 从哪开始学习, 取决

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

参考页面: http://www.yuanjiaocheng.net/ASPNET-CORE/core-static-files.html http://www.yuanjiaocheng.net/ASPNET-CORE/setup-mvc.html http://www.yuanjiaocheng.net/ASPNET-CORE/mvc-design-pattern.html http://www.yuanjiaocheng.net/ASPNET-CORE/mvc-routing.html h

2019-11-27-WPF-全屏透明窗口

原文:2019-11-27-WPF-全屏透明窗口 title author date CreateTime categories WPF 全屏透明窗口 lindexi 2019-11-27 09:22:19 +0800 2019-11-27 08:48:26 +0800 WPF 本文告诉大家如何在 WPF 做一个全屏的透明窗口,和全屏透明窗口的坑 使用下面代码就可以作出全屏透明窗口 public MainWindow() { InitializeComponent(); AllowsTransp

《Programming WPF》翻译 第8章 5.创建动画过程

原文:<Programming WPF>翻译 第8章 5.创建动画过程 所有在这章使用xaml举例说明的技术,都可以在代码中使用,正如你希望的.可是,代码可以使用动画在某种程度上不可能在xaml中实现的. 在代码中创建动画需要稍微多一点的努力--比使用标记.然而,代码提供了更多的弹性.你可以在运行期计算属性,而不是在xaml中硬编码,从而支持你的动画适应环境.例如,这可能是有用的--在当前窗体的大小基于动画的参数. 使用代码一个额外的好处是我们不需要使用storyboard,替代的,我们可以创

《Programming WPF》翻译 第8章 2.Timeline

原文:<Programming WPF>翻译 第8章 2.Timeline Timeline代表了时间的延伸.它通常还描述了一个或多个在这段时间所发生的事情.例如,在前面章节描述的动画类型,都是Timeline.可哦率这样的DoubleAnimation: <DoubleAnimation From=”10” To=”300” Duration=”0:0:5” /> 正如Duration属性指出的,这代表了一个5秒的时间长度.所有类型的Timeline总是有一个开始时间和一个持续时

《Programming WPF》翻译 第9章 6.我们进行到哪里了?

原文:<Programming WPF>翻译 第9章 6.我们进行到哪里了? 只有当任何内嵌控件都没有提供你需要的底层行为时,你将要写一个自定义控件.当你写一个自定义控件,你将要使用到依赖属性系统,来提供支持数据绑定和动画的属性.你将使用routed事件结构来暴露事件.如果你想写一个没有外观的控件,允许其可视化能被替换--如内嵌控件,你必须考虑你的控件和模板之间如何进行交互.你还将要为一个提供了一组默认可视化的模板提供一个默认值.

《Programming WPF》翻译 第9章 4.模板

原文:<Programming WPF>翻译 第9章 4.模板 对一个自定义元素最后的设计考虑是,它是如何连接其可视化的.如果一个元素直接从FrameworkElement中派生,这将会适当的生成它自己的可视化.(第7章描述了如何创建一个图形外观.)尤其是,如果你创建了一个元素,是为了提供一个特定的可视化表现,该元素应该完全控制这个可视化是如何管理的,一旦你编写了一个控件,通常你不会将一个图形硬编码到里面. 记住,一个控件的工作是提供行为.可视化是由控件模板提供的.这种可视化是由控件模板提供的

《Programming WPF》翻译 第9章 2.选择一个基类

原文:<Programming WPF>翻译 第9章 2.选择一个基类 WPF提供了很多类,当创建一个自定义元素时,你可以从这些类中派生.图9-1显示了一组可能作为类--可能是合适的基类,并且说明了他们之间的继承关系.注意到,这决不是完整的继承关系图,只是简单的显示了一些你应该考虑的可能的基类. 无论你选择了哪一个基类,你的元素都会直接或间接地从FrameworkElement派生.这将提供routing事件,高级属性处理,动画,数据绑定,外观上的支持,样式,以及逻辑树的集成. 派生于Fram