原文:UWP入门(五)--控件模板

通过在 XAML 框架中创建控件模板,你可以自定义控件的可视结构和可视行为(eg:勾选框的三种状态)。 控件有多个属性,如 Background、Foreground 以及 FontFamily,可以设置这些属性以指定控件外观的多个方面。 但是可以通过设置这些属性所做的更改有限。 你可以通过使用 ControlTemplate 类创建模板来指定其他自定义。 我们在此处介绍如何创建 ControlTemplate 以自定义 CheckBox 控件的外观。

核心API

  • ControlTemplate 类
  • Control.Template 属性

1.自定义控件模板示例

在默认情况下,CheckBox 控件将其内容(字符串或 CheckBox 旁的对象)放在选择框的右侧,并使用复选标记来表示用户已选中 CheckBox。 这些特性表示 CheckBox 的可视结构和可视行为。

下面是分别在 Unchecked、Checked 和 Indeterminate 状态下使用默认 ControlTemplate 的 CheckBox。

你可以通过为 CheckBox 创建 ControlTemplate 来更改这些特性。 例如,如果你想要让复选框的内容显示在选择框下方,并且你想要用 X 来表示用户已选中复选框。 你可以在 CheckBox 的 ControlTemplate 中指定这些特性

若要将自定义模板与控件一起使用,请将 ControlTemplate 分配给控件的 Template 属性。 下面是使用称为 CheckBoxTemplate1 的 ControlTemplate 的 CheckBox

  1. //ControlTemplate 分配给控件的 Template 属性
  2. <CheckBox Content="CheckBox" Template="{StaticResource CheckBoxTemplate1}" IsThreeState="True" Margin="20"/>

下面是在应用模板后,CheckBox 在 Unchecked、Checked 和 Indeterminate 状态下的外观

2.指定控件的可视结构

当你创建 ControlTemplate 时,结合 FrameworkElement 对象来生成一个单一的控件。 ControlTemplate 只能有一个 FrameworkElement 作为其根元素。 该根元素通常包含其他 FrameworkElement 对象。 这些对象的组合组成控件的可视结构

  1. <ControlTemplate x:Key="CheckBoxTemplate1" TargetType="CheckBox">
  2. <Border BorderBrush="{TemplateBinding BorderBrush}"
  3. BorderThickness="{TemplateBinding BorderThickness}"
  4. Background="{TemplateBinding Background}">
  5. <Grid>
  6. <Grid.RowDefinitions>
  7. <RowDefinition Height="*"/>
  8. <RowDefinition Height="25"/>
  9. </Grid.RowDefinitions>
  10. <Rectangle x:Name="NormalRectangle" Fill="Transparent" Height="20" Width="20"
  11. Stroke="{ThemeResource SystemControlForegroundBaseMediumHighBrush}"
  12. StrokeThickness="{ThemeResource CheckBoxBorderThemeThickness}"
  13. UseLayoutRounding="False"/>
  14. <!-- Create an X to indicate that the CheckBox is selected. -->
  15. <Path x:Name="CheckGlyph"
  16. Data="M103,240 L111,240 119,248 127,240 135,240 123,252 135,264 127,264 119,257 111,264 103,264 114,252 z"
  17. Fill="{ThemeResource CheckBoxForegroundThemeBrush}"
  18. FlowDirection="LeftToRight"
  19. Height="14" Width="16" Opacity="0" Stretch="Fill"/>
  20. <Ellipse x:Name="IndeterminateGlyph"
  21. Fill="{ThemeResource CheckBoxForegroundThemeBrush}"
  22. Height="8" Width="8" Opacity="0" UseLayoutRounding="False" />
  23. <ContentPresenter x:Name="ContentPresenter"
  24. ContentTemplate="{TemplateBinding ContentTemplate}"
  25. Content="{TemplateBinding Content}"
  26. Margin="{TemplateBinding Padding}" Grid.Row="1"
  27. HorizontalAlignment="Center"
  28. VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
  29. </Grid>
  30. </Border>
  31. </ControlTemplate>

3.指定控件的可视行为

可视行为指定控件在确定状态下的外观。 CheckBox 控件具有 3 种复选状态:Checked、Unchecked 和 Indeterminate。 IsChecked 属性的值确定 CheckBox 的状态,其状态确定框中显示的内容。

下表列出了 IsChecked 的可能值、CheckBox 的相应状态,以及 CheckBox 的外观

使用 VisualState 对象可指定控件在某种状态下的外观。 VisualState 包含可更改 ControlTemplate 中元素外观的 SetterStoryboard。 当控件进入 VisualState.Name 属性指定的状态时,将应用 Setter 或 Storyboard 中的属性更改。 当控件退出该状态时,这些更改将会删除。 你可以将 VisualState 对象添加到 VisualStateGroup 对象。 还可以将 VisualStateGroup 对象添加到 VisualStateManager.VisualStateGroups 附加属性,这些对象在 ControlTemplate 的根 FrameworkElement 上设置

以下 XAML 介绍在 Checked、Unchecked 和 Indeterminate 状态下的 VisualState 对象。 该示例在 Border 上设置 VisualStateManager.VisualStateGroups 附加属性,它是 ControlTemplate 的根元素。 Checked VisualState 指定名为 CheckGlyph 的 Path(已在前面的示例中介绍)的 Opacity 为 1。 Indeterminate VisualState 指定名为 IndeterminateGlyph 的 Ellipse 的 Opacity 为 1。 Unchecked VisualState 没有 Setter 或 Storyboard,因此 CheckBox 将返回到其默认外观

  1. <ControlTemplate x:Key="CheckBoxTemplate1" TargetType="CheckBox">
  2. <Border BorderBrush="{TemplateBinding BorderBrush}"
  3. BorderThickness="{TemplateBinding BorderThickness}"
  4. Background="{TemplateBinding Background}">
  5. <VisualStateManager.VisualStateGroups>
  6. <VisualStateGroup x:Name="CheckStates">
  7. <VisualState x:Name="Checked">
  8. <VisualState.Setters>
  9. <Setter Target="CheckGlyph.Opacity" Value="1"/>
  10. </VisualState.Setters>
  11. <!-- This Storyboard is equivalent to the Setter. -->
  12. <!--<Storyboard>
  13. <DoubleAnimation Duration="0" To="1"
  14. Storyboard.TargetName="CheckGlyph" Storyboard.TargetProperty="Opacity"/>
  15. </Storyboard>-->
  16. </VisualState>
  17. <VisualState x:Name="Unchecked"/>
  18. <VisualState x:Name="Indeterminate">
  19. <VisualState.Setters>
  20. <Setter Target="IndeterminateGlyph.Opacity" Value="1"/>
  21. </VisualState.Setters>
  22. <!-- This Storyboard is equivalent to the Setter. -->
  23. <!--<Storyboard>
  24. <DoubleAnimation Duration="0" To="1"
  25. Storyboard.TargetName="IndeterminateGlyph" Storyboard.TargetProperty="Opacity"/>
  26. </Storyboard>-->
  27. </VisualState>
  28. </VisualStateGroup>
  29. </VisualStateManager.VisualStateGroups>
  30. <Grid>
  31. <Grid.RowDefinitions>
  32. <RowDefinition Height="*"/>
  33. <RowDefinition Height="25"/>
  34. </Grid.RowDefinitions>
  35. <Rectangle x:Name="NormalRectangle" Fill="Transparent" Height="20" Width="20"
  36. Stroke="{ThemeResource SystemControlForegroundBaseMediumHighBrush}"
  37. StrokeThickness="{ThemeResource CheckBoxBorderThemeThickness}"
  38. UseLayoutRounding="False"/>
  39. <!-- Create an X to indicate that the CheckBox is selected. -->
  40. <Path x:Name="CheckGlyph"
  41. Data="M103,240 L111,240 119,248 127,240 135,240 123,252 135,264 127,264 119,257 111,264 103,264 114,252 z"
  42. Fill="{ThemeResource CheckBoxForegroundThemeBrush}"
  43. FlowDirection="LeftToRight"
  44. Height="14" Width="16" Opacity="0" Stretch="Fill"/>
  45. <Ellipse x:Name="IndeterminateGlyph"
  46. Fill="{ThemeResource CheckBoxForegroundThemeBrush}"
  47. Height="8" Width="8" Opacity="0" UseLayoutRounding="False" />
  48. <ContentPresenter x:Name="ContentPresenter"
  49. ContentTemplate="{TemplateBinding ContentTemplate}"
  50. Content="{TemplateBinding Content}"
  51. Margin="{TemplateBinding Padding}" Grid.Row="1"
  52. HorizontalAlignment="Center"
  53. VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
  54. </Grid>
  55. </Border>
  56. </ControlTemplate>

UWP入门(五)--控件模板的更多相关文章

  1. Expression Blend实例中文教程(13) - 控件模板快速入门ControlTemplates

    上篇,介绍了控件样式(Style)和模板(Template)的基础概念,并且演示了使用Blend设计控件样式.本篇将继续介绍使用Blend设计自定义控件模板 - ControlTemplate.Con ...

  2. 【WPF学习】第五十九章 理解控件模板

    最近工作比较忙,未能及时更新内容,敬请了解!!! 对于可视化树的分析引出了几个有趣问题.例如,控件如何从逻辑树表示扩张成可视化树表示? 每个控件都有一个内置的方法,用于确定如何渲染控件(作为一组更基础 ...

  3. CPF 入门教程 - 控件布局(六)

    CPF netcore跨平台桌面UI框架 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) CPF 入门教程 - 样式和动画(三) CPF 入门教程 - 绘图(四) C ...

  4. Windows Phone开发(16):样式和控件模板

    原文:Windows Phone开发(16):样式和控件模板 在前面资源一文中也提过样式,样式就如同我们做HTML页排版时常用到的CSS样式表,它是对于特定娄型的可视化元素,应该可以直接说是针对控件的 ...

  5. 背水一战 Windows 10 (79) - 自定义控件: Layout 系统, 控件模板, 事件处理

    [源码下载] 背水一战 Windows 10 (79) - 自定义控件: Layout 系统, 控件模板, 事件处理 作者:webabcd 介绍背水一战 Windows 10 之 控件(自定义控件) ...

  6. Blend 2015 教程 (四)控件模板

    前一篇讲述了修改ListBox样式的方法,本篇将修改性别显示区域的样式. 1. 选择ListBox控件,编辑ItemTemplate的当前项,选择CheckBox控件,在美工板导航栏中点击CheckB ...

  7. WPF控件模板

    引言:在进行WPF项目开发过程中,由于项目的需要,经常要对某个控件进行特殊的设定,其中就牵涉到模板的相关方面的内容.本文也是在自己进行项目开发过程中遇到控件模板设定时集中搜集资料后整理出来的,以供在以 ...

  8. WPF--Blend制作Button控件模板--问题补充

    补充记录Button控件模板 控件模板制作过程中出现下图问题:动画对象不能用于动画属性"Fill” 并且这类问题Blend4中包括VS2010中仍然可以运行,但是只有VS2010中会报错:如 ...

  9. WPF--Blend制作Button控件模板

    博客园新人,WPF初学者.不涉及理论知识,直接进入操作. 记录一下使用Blend制作Button控件模板过程中,学到Blend几个知识点: 1.渐变画笔编辑器的Alpha选项可以调控件的透明度.即下图 ...

随机推荐

  1. Android Xfermode 真实 实现全面、圆角图片

    转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/42094215.本文出自:[张鸿洋的博客] 1.概述 事实上这篇本来准备Andro ...

  2. MapReduce 经典案例手机流量排序的分析

    在进行流量排序之前,先要明白排序是发生在map阶段,排序之后(排序结束后map阶段才会显示100%完成)才会到reduce阶段(事实上reduce也会排序),.此外排序之前要已经完成了手机流量的统计工 ...

  3. Eclipse 学习总结

    一. Eclipse 中一个普通 JavaWeb 项目的目录结构 如果项目工程中没有web.xml文件,可以手动动态添加.        右击项目 ->  java EE Tools  -> ...

  4. jQuery插件开发小总结

    另一篇 jQuery插件开发通常有3种方式 通过$.extend()来扩展jQuery 通过$.fn 向jQuery添加新的方法 通过$.widget()应用jQuery UI的部件工厂方式创建 通常 ...

  5. STL序列容器之vector

    一,vector容器简介 1.vector容器的原理 vector是将元素置于一个动态数组中加以管理的容器. 2.vector容器的特点 vector容器可以随机存取元素,支持索引存取(即用数组下标的 ...

  6. 利用.net Core 对程序集中的类 进行统一依赖注入

    1.创建特性 用于标注依赖注入 using Microsoft.Extensions.DependencyInjection; using System; using System.Collectio ...

  7. zedboard之GPIO驱动器(离FPGA直到LINUX申请书)

    笔者:xiabodan   资源: http://blog.csdn.net/xiabodan/article/details/24308373 1 EDK 大家知道我们在EDK中建立GPIO然后倒出 ...

  8. python3使用Lxml库操作XPath

    download address: http://pypi.python.org/pypi/lxml/2.3 lxml is a Pythonic, mature binding for the li ...

  9. [Sql Server 2008 基础] With Ties. Over()子句

    with ties WITH TIES 指定从基本结果集中返回额外的行,对于 ORDER BY 列中指定的排序方式参数,这些额外的返回行的该参数值与 TOP n (PERCENT) 行中的最后一行的该 ...

  10. Java高级应用(一个)-文件夹监控服务

    最近.在研究一些比较成熟的框架.他们还发现,他们中的一些相当不错的文章.现在,对于一些在你们中间一个简单的翻译(版的英文文章,非常有帮助). 译:原文链接 你有没有发现,当你编辑一个文件.同一时候使用 ...