WP8.1学习系列(第二十五章)——控件样式

XAML 框架提供许多自定义应用外观的方法。通过样式可以设置控件属性,并重复使用这些设置,以便保持多个控件具有一致的外观。

路线图: 本主题与其他主题有何关联?请参阅:

本主题包含下列部分:

先决条件

我们假定你可以将控件添加到 UI,设置控件的属性以及连接事件处理程序。有关将控件添加到应用的说明,请参阅快速入门:添加控件和处理事件

样式基础知识

使用样式可将属性设置提取到可重复使用的资源中。下面的示例显示了具有设置BorderBrushBorderThickness 和 Foreground 属性样式的 3 个按钮。通过应用样式,你无须单独为每个控件设置这些属性,并且这些控件全部都有相同的外观。

你可以定义在 Extensible Application Markup Language (XAML) 中为控件定义嵌入样式,或者作为可重复使用的资源。在单个页面的 XAML 文件中、App.xaml 文件中,或者单独的资源词典 XAML 文件中定义资源。可以在应用之间共享资源词典 XAML 文件,并且可以将多个资源词典合并到单个应用中。定义资源的位置决定了该资源可以使用的范围。页面级资源只在定义了它们的页面中可用。如果在 App.xaml 和页面中同时定义了具有相同关键字的资源,则页面中的资源将覆盖 App.xaml 中的资源。如果资源在单独的资源词典文件中定义,则它的范围由引用资源词典的位置确定。

在 Style 定义中,你需要一个 TargetType 属性和由一个或多个 Setter 元素组成的集合。TargetType 属性是一个指定要应用样式的 FrameworkElement 类型的字符串。TargetType 值必须指定由 Windows 运行时定义的派生的 FrameworkElement 类型或引用的程序集中提供的自定义类型。如果你试图将某个样式应用到某控件,而此控件的类型与你试图应用的样式的 TargetType 属性不匹配,则会发生异常。

每个 Setter 元素都需要一个 Property 和一个 Value。这些属性设置用于指示该设置将应用于哪个控件属性,以及为该属性设置的值。你可以使用特性或属性元素语法设置 Setter.Value。下面的 XAML 显示了在之前的示例中使用的样式。在此 XAML 中,前两个 Setter 元素使用特性语法,但是最后一个 Setter(用于设置 BorderBrush属性)使用属性元素语法。该示例不使用 x:Key 属性,因此该样式已隐式应用到按钮。隐式或显式应用样式在下一节进行介绍。

XAML

<Page.Resources>
    <Style TargetType="Button">
        <Setter Property="BorderThickness" Value="5" />
        <Setter Property="Foreground" Value="Blue" />
        <Setter Property="BorderBrush" >
            <Setter.Value>
                <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
                    <GradientStop Color="Yellow" Offset="0.0" />
                    <GradientStop Color="Red" Offset="0.25" />
                    <GradientStop Color="Blue" Offset="0.75" />
                    <GradientStop Color="LimeGreen" Offset="1.0" />
                </LinearGradientBrush>
            </Setter.Value>
            </Setter>
        </Style>
</Page.Resources>

应用隐式或显式样式

如果你将样式定义为资源,则有两种方法可将其应用到控件:

如果样式包含 x:Key 属性,则只能通过将控件的 Style 属性设置为关键字定义的样式,从而将其应用到控件。相反,没有 x:Key 特性的样式会自动应用到其目标类型的每个控件,这些控件没有显示样式设置。

下面两个按钮演示了隐式和显示样式。

在本示例中,第一个样式具有 x:Key 属性,其目标类型为 Button。第一个按钮的 Style 属性设置为此关键字,所以显示应用该样式。第二个样式会隐式应用到第二个按钮,因为该按钮的目标类型为 Button,并且该样式没有 x:Key 属性。

XAML

<Page.Resources>
    <Style x:Key="PurpleStyle" TargetType="Button">
        <Setter Property="FontFamily" Value="Lucida Sans Unicode" />
        <Setter Property="FontStyle" Value="Italic" />
        <Setter Property="FontSize" Value="14" />
        <Setter Property="Foreground" Value="MediumOrchid" />
    </Style>

    <Style TargetType="Button">
        <Setter Property="FontFamily" Value="Lucida Sans Unicode" />
        <Setter Property="FontStyle" Value="Italic" />
        <Setter Property="FontSize" Value="14" />
        <Setter Property="RenderTransform">
            <Setter.Value>
                <RotateTransform Angle="25" />
            </Setter.Value>
        </Setter>
        <Setter Property="BorderBrush" Value="Orange" />
        <Setter Property="BorderThickness" Value="2" />
        <Setter Property="Foreground" Value="Orange" />
    </Style>
</Page.Resources>
<Grid x:Name="LayoutRoot">
    <Button Content="Button" Height="23" Width="75" Style="{StaticResource PurpleStyle}" />
    <Button Content="Button" Height="23" Width="75" />
</Grid>

使用基于样式

为了使样式便于维护以及优化样式的重复使用,你可以创建从其他样式继承的样式。使用 BasedOn 属性可创建继承的样式。从其他样式继承的样式必须应用到同一类型的控件,或者从基本样式的目标类型派生出来的控件。例如,如果基本样式的目标类型为 ContentControl,则基于此样式的样式可应用到 ContentControl 或从ContentControl 派生的类型(如 Button 和 ScrollViewer)。如果基于样式的值没有设置,则从基本样式继承。要从基本样式更改值,基于样式会覆盖该值。 下一个示例演示了具有从同一基本样式继承的样式的 Button和 CheckBox

基本样式应用到 ContentControl,并设置 Height 和 Width 属性。基于此样式的样式应用到 CheckBox 和Button,这些类型从 ContentControl 派生而来。基于样式为 BorderBrush 和 Foreground 属性设置不同的颜色。

XAML

<Page.Resources>
    <Style x:Key="BasicStyle" TargetType="ContentControl">
        <Setter Property="Width" Value="100" />
        <Setter Property="Height" Value="30" />
    </Style>
    <Style x:Key="ButtonStyle" TargetType="Button" BasedOn="{StaticResource BasicStyle}">
        <Setter Property="BorderBrush" Value="Orange" />
        <Setter Property="BorderThickness" Value="2" />
        <Setter Property="Foreground" Value="Orange" />
    </Style>
    <Style x:Key="CheckBoxStyle" TargetType="CheckBox" BasedOn="{StaticResource BasicStyle}">
        <Setter Property="BorderBrush" Value="Green" />
        <Setter Property="BorderThickness" Value="2" />
        <Setter Property="Foreground" Value="Green" />
    </Style>
</Page.Resources>

<Grid Background="White">
    <Button Content="Button" Style="{StaticResource ButtonStyle}"/>
    <CheckBox Content="CheckBox"  Style="{StaticResource CheckBoxStyle}"/>
</Grid>

使用工具轻松处理样式

将样式应用到控件的一种快捷方式是,在 Microsoft Visual Studio XAML 设计界面上,右键单击控件并选择“编辑样式”或“编辑模板”(取决于右键单击的控件)。然后,通过选择“应用资源”来应用现有样式,或通过选择“创建空项”来定义一个新样式。 如果创建空白样式,则可以使用相应的选项在该页面、App.xaml 文件或一个单独的资源字典中进行定义。

修改 Windows 运行时默认样式

在可以使用来自 Windows 运行时默认 XAML 资源的样式时,应使用这些样式。在必须定义自己的样式时,如果可能,请尝试以默认样式为基础(如前所述,使用基于样式,或先编辑最初默认样式的副本)。

Template 属性

样式 setter 可用于 Control 的 Template 属性,实际上,此样式构成了多数典型的 XAML 样式和应用的 XAML 资源。此内容将在快速入门:控件模板这一主题中更详细地讨论。

时间: 2024-11-03 21:44:28

WP8.1学习系列(第二十五章)——控件样式的相关文章

WP8.1学习系列(第二十六章)——控件模板

在本文中 自定义控件模板示例 指定控件的可视结构. 指定控件的可视行为 使用工具轻松处理主题 控件和辅助功能 了解有关控件默认模板的详细信息 控件模板中的主题资源 相关主题 在 XAML 框架中,如果要自定义控件的可视结构和可视行为,请创建控件模板.控件有多个属性,如 Background.Foreground 以及FontFamily,可以设置这些属性以指定控件外观的多个方面.但是可以通过设置这些属性所做的更改有限.可以使用 ControlTemplate 类创建提供其他自定义的模板.在此处,

WP8.1学习系列(第二十二章)——在页面之间导航

在本文中 先决条件 创建导航应用 Frame 和 Page 类 页面模板中的导航支持 在页面之间传递信息 缓存页面 摘要 后续步骤 相关主题 重要的 API Page Frame NavigationCacheMode 本主题将讨论基本的导航概念,并演示如何创建一个在两个页面之间进行导航的应用. 有关为你的应用选择最佳导航模式的帮助,请参阅导航模式. 在操作时请参阅平面导航和分层导航模式,它们是应用功能大全系列的一部分. 路线图: 本主题与其他主题有何关联?请参阅: 使用 C# 或 Visual

WP8.1学习系列(第二十四章)——Json解析

.net已经集成了json解析,类名叫DataContractJsonSerializer DataContractJsonSerializer 类型公开以下成员. 构造函数   名称 说明 DataContractJsonSerializer(Type) 初始化 DataContractJsonSerializer 类的新实例,以便序列化或反序列化指定类型的对象. DataContractJsonSerializer(Type, IEnumerable<Type>) 初始化 DataCont

【WPF学习】第十九章 控件类

原文:[WPF学习]第十九章 控件类 WPF窗口充满了各种元素,但这些元素中只有一部分是控件.在WPF领域,控件通常被描述为与用户交互的元素--能接收焦点并接受键盘或鼠标输入的元素.明显的例子包括文本框和按钮.然而,这个区别有时有些模糊.将工具提示视为控件,因为它根据用户鼠标的移动显示或消失.将标签视为控件,因为它支持记忆码(mnemonics,将焦点转移到相关控件快捷键). 所有控件都继承自System.Windows.Control类,该类添加了一小部分基本的基础结构: 设置控件内容对齐方式

WP8.1学习系列(第十九章)——事件和路由事件概述

我们将介绍在使用 C#.Visual Basic 或 Visual C++ 组件扩展 (C++/CX) 作为编程语言并使用 XAML 进行 UI 定义时,针对 Windows 运行时应用的事件的编程概念.你可以在 XAML 中的 UI 元素声明中为事件分配处理程序,或者在代码中添加处理程序.Windows 运行时支持路由事件:借助此功能,某些输入事件和数据事件可由引发该事件的对象以外的对象来处理.在定义控件模板或使用页面或版式容器时,路由事件十分有用. 事件即编程概念 通常而言,对 Window

WP8.1学习系列(第十二章)——全景控件Panorama开发指南

2014/6/18 适用于:Windows Phone 8 和 Windows Phone Silverlight 8.1 | Windows Phone OS 7.1 全景体验是本机 Windows Phone 外观的一部分.与旨在适合手机屏幕边界的标准应用不同,全景应用通过使用超出屏幕边界的长水平画布提供了一个查看控件.数据和服务的独特方式.这些固有的动态视图使用分层动画和内容,以便各层以不同的速度流畅地平移,类似于视差效果. 本主题包括以下部分. 全景控件概述 导航支持 全景应用功能 相关

WP8.1学习系列(第十六章)——交互UX之命令模式

命令模式 在本文中 命令类型 命令放置 相关主题 你可以在应用商店应用的几个曲面中放置命令和控件,包括应用画布.弹出窗口.对话框和应用栏.在正确的时间选择合适的曲面可能就是易于使用的应用和很难使用的应用之间的差别. 在应用商店应用中,命令是用户可用来执行操作的交互式 UI 元素.命令与导航元素不同,导航元素用于将用户转移到不同的页面,而命令则可让用户对当前页面执行操作.导航元素使应用可以使用.命令使应用有使用价值. 有关应用中不同命令图面的详细信息,请参阅布置你的 UI. 命令类型 筛选 筛选命

【WPF学习】第二十五章 日期控件

WPF包含两个日期控件:Calender和DatePicker.这两个控件都被设计为允许用户选择日期. Calendar控件显示日期,在与Windows操作系统中看到的日历(例如,当配置系统日期时看到的日历)相似.该控件每次显示一个月份,允许从一个月份跳到另一个月份(通过单击箭头按钮),或跳到某个特定的月份(通过单击月份的标题头查看一年中的月份,然后单击月份). DatePicker控件需要的空间更少.它模范简单的文本框,该文本框以长日期格式或短日期格式保存日期字符串.DatePicker控件提

“全栈2019”Java多线程第二十五章:生产者与消费者线程详解

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多线程第二十五章:生产者与消费者线程详解 下一章 "全栈2019"Java多线程第二十六章:同步方法生产者与消费者线程 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"