Style 类

定义

包含可在类型实例之间共享的属性资源库。 样式通常在资源集合中声明,以便可以共享并用于应用控件模板和其他样式。

public ref class Style sealed : DependencyObject
/// [Windows.Foundation.Metadata.Activatable(Windows.UI.Xaml.IStyleFactory, 65536, Windows.Foundation.UniversalApiContract)]
/// [Windows.Foundation.Metadata.Activatable(65536, Windows.Foundation.UniversalApiContract)]
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
/// [Windows.UI.Xaml.Markup.ContentProperty(Name="Setters")]
class Style final : DependencyObject
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
/// [Windows.UI.Xaml.Markup.ContentProperty(Name="Setters")]
/// [Windows.Foundation.Metadata.Activatable(65536, "Windows.Foundation.UniversalApiContract")]
/// [Windows.Foundation.Metadata.Activatable(Windows.UI.Xaml.IStyleFactory, 65536, "Windows.Foundation.UniversalApiContract")]
class Style final : DependencyObject
[Windows.Foundation.Metadata.Activatable(typeof(Windows.UI.Xaml.IStyleFactory), 65536, typeof(Windows.Foundation.UniversalApiContract))]
[Windows.Foundation.Metadata.Activatable(65536, typeof(Windows.Foundation.UniversalApiContract))]
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
[Windows.UI.Xaml.Markup.ContentProperty(Name="Setters")]
public sealed class Style : DependencyObject
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
[Windows.UI.Xaml.Markup.ContentProperty(Name="Setters")]
[Windows.Foundation.Metadata.Activatable(65536, "Windows.Foundation.UniversalApiContract")]
[Windows.Foundation.Metadata.Activatable(typeof(Windows.UI.Xaml.IStyleFactory), 65536, "Windows.Foundation.UniversalApiContract")]
public sealed class Style : DependencyObject
Public NotInheritable Class Style
Inherits DependencyObject
<Style .../>
-or-
<Style ...>
  oneOrMoreSetters
</Style>
继承
Object Platform::Object IInspectable DependencyObject Style
属性

Windows 要求

设备系列
Windows 10 (在 10.0.10240.0 中引入)
API contract
Windows.Foundation.UniversalApiContract (在 v1.0 中引入)

示例

此示例创建两个样式:一个用于 TextBlock ,一个用于 TextBox。 每个样式都应用于控件的两个实例,以便为每个 TextBlockTextBox 创建统一的外观。 该示例通过将 Style 引用为 {StaticResource} 标记扩展来设置每个控件的 FrameworkElement.Style 属性。 该示例还演示如何从资源字典中检索样式并将其应用于代码中的控件。

每个样式都有多个 Setter 部件。 在此 XAML 中,不显示 XAML Style.Setters 属性元素。 这是此属性在 XAML 中的典型用法。 该值 Style.Setters 是隐式的,因为 Setters 是 Style 的 XAML 内容属性。 有关 XAML 语法以及 XAML 内容语法如何使暗示和省略某些 XAML 元素的详细信息,请参阅 XAML 语法指南

请注意,在 TextBox 的样式中, Margin 属性设置为 4,这意味着 TextBox 的所有边距都为 4。 为了补偿第二个 TextBlock 的长度,该长度比第一个 TextBlock 短,因为姓氏占用的空间小于名字,将值“6,4,4,4”分配给第二个 TextBox 上的 Margin 属性。 这会导致第二个 TextBox 的边距与样式指定的边距不同,因此它与第一个 TextBox 水平对齐。

<StackPanel x:Name="rootPanel">
  <StackPanel.Resources>
    <!--Create a Style for a TextBlock to specify that the
              Foreground equals Navy, FontSize equals 14, and
              VerticalAlignment equals Botton.-->
    <Style TargetType="TextBlock" x:Key="TextBlockStyle">
      <Setter Property="Foreground" Value="Navy"/>
      <Setter Property="FontSize" Value="14"/>
      <Setter Property="VerticalAlignment" Value="Bottom"/>
    </Style>

    <!--Create a Style for a TextBox that specifies that
              the Width is 200, Height is 30, Margin is 4,
              Background is LightBlue, and FontSize is 14.-->
    <Style TargetType="TextBox" x:Key="TextBoxStyle">
      <Setter Property="Width" Value="200"/>
      <Setter Property="Height" Value="30"/>
      <Setter Property="Margin" Value="4"/>
      <Setter Property="FontSize" Value="14"/>
      <Setter Property="Background">
        <Setter.Value>
          <LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
            <GradientStop Color="White" Offset="0.0"/>
            <GradientStop Color="LightBlue" Offset="0.5"/>
            <GradientStop Color="Navy" Offset="1"/>
          </LinearGradientBrush>
        </Setter.Value>
      </Setter>
    </Style>
  </StackPanel.Resources>

  <!--Apply the TextBlockStyle and TextBoxStyle to each 
      TextBlock and TextBox, respectively.-->
  <StackPanel Orientation="Horizontal">
    <TextBlock Text="First Name:" Style="{StaticResource TextBlockStyle}"/>
    <TextBox Style="{StaticResource TextBoxStyle}"/>
  </StackPanel>
  <StackPanel Orientation="Horizontal">
    <TextBlock Text="Last Name:" Style="{StaticResource TextBlockStyle}"/>
    <TextBox Style="{StaticResource TextBoxStyle}"
             Margin="6,4,4,4"/>
  </StackPanel>
  <StackPanel x:Name="emailAddressPanel" Orientation="Horizontal"/>
</StackPanel>
private void ShowEmailAddressBox()
{
    TextBlock emailAddressLabel = new TextBlock();
    emailAddressLabel.Text = "Email:";
    emailAddressLabel.Style = (Style)rootPanel.Resources["TextBlockStyle"];

    TextBox emailAddressBox = new TextBox();
    emailAddressBox.Style = (Style)rootPanel.Resources["TextBoxStyle"];
    emailAddressBox.Margin = new Thickness(38, 4, 4, 4);

    emailAddressPanel.Children.Add(emailAddressLabel);
    emailAddressPanel.Children.Add(emailAddressBox);
}

此示例创建两个样式元素。 第一个样式元素的 TargetType 设置为 TextBox,第二个样式元素的 TargetType 设置为 Button。 然后,它们将作为 TextBox 控件和 Button 控件的隐式样式应用。

<StackPanel>
    <StackPanel.Resources>
        <Style TargetType="TextBox">
            <Setter Property="Foreground" Value="Pink" />
            <Setter Property="FontSize" Value="15" />                
        </Style>
        
        <Style TargetType="Button">
            <Setter Property="Foreground" Value="Black" />
            <Setter Property="Background" Value="Yellow" />
        </Style>
    </StackPanel.Resources>
    
    <TextBox Height="30" Width="120" Margin="2" Text="TextBoxStyle" />
    <Button Height="30" Width="100" Margin="2" Content="ButtonStyle" />
</StackPanel>

此示例创建一个名为 InheritedStyle 的 Style,该样式基于名为 BaseStyle 的 Style。 InheritedStyle 从 BaseStyle 继承 Yellow 的 Background 值,并添加红色的前景值。

<StackPanel>
    <StackPanel.Resources>
        <Style x:Key="BaseStyle" TargetType="Button">
            <Setter Property="Background" Value="Yellow" />
        </Style>
        <!--Create a Style based on BaseStyle-->
        <Style x:Key="InheritedStyle" TargetType="Button" BasedOn="{StaticResource BaseStyle}">
            <Setter Property="Foreground" Value="Red" />
        </Style>
    </StackPanel.Resources>
    <!--A button with default style-->
    <Button Content="HelloWorld" />
    <!--A button with base style-->
    <Button Content="HelloWorld" Style="{StaticResource BaseStyle}" />
    <!--A button with a style that is inherited from the BaseStyle-->
    <Button Content="HelloWorld" Style="{StaticResource InheritedStyle}" />
</StackPanel>

注解

Style 基本上是应用于具有此类属性的特定类型的一个或多个实例的属性设置的集合。 Style 包含一个或多个 Setter 对象的集合。 每个 资源库 都有一个 Property一个 Value属性是应用样式的元素的属性的名称。 Value 是应用于属性的值。

为了应用 Style,目标对象必须是 DependencyObject。 每个 Setter 引用为 Property 值的属性必须是依赖属性。

创建 Style 时,必须设置 TargetType 属性。 否则会引发异常。

如果在 Style 中为同一属性设置值,并且直接在元素上设置值,则直接在元素上设置的值优先。 有关详细信息,请参阅 依赖属性概述,特别是“依赖属性值优先级”部分。

样式 定义为 XAML 资源

样式几乎始终在 XAML 中定义为 ResourceDictionary 中的资源。

  • 对于仅由同一 XAML 页中定义的其他 UI 项使用的 Style,如果根元素是 Page) ,通常会在 FrameworkElement.Resources 集合 (Page.Resources定义 Style。
  • 对于应用中多个页面使用的 Style,通常在 Application.Resources 集合中定义 Style。 或者,对于 Application.Resources 中包含的应用,你可能具有单独的 XAML 文件作为 MergedDictionaries 值。
  • 大多数 UI 元素都具有由Windows 运行时定义的默认样式。 默认样式的副本可以在名为 generic.xaml 的设计帮助程序 XAML 文件中查看,该文件在技术上不是应用的资源文件,尽管其结构类似于一个。 在编辑由工具启用的样式副本时,可以将此文件的离散部分复制到应用的 XAML 中,作为起点,但创建此类副本后,需要将其包含在其中一个 Resources 集合中或通过 MergedDictionaries 间接访问。 在所有这些情况下,将替代默认值的已修改 XAML 作为应用的一部分包含在内。

Windows 8 如果要在 Windows 8 XAML 中重新模板化现有控件,有时会修改大多数起始应用模板中包含的 StandardStyles.xaml XAML 文件中存在的 Style 元素。 StandardStyles.xaml 被模板 app.xaml 文件引用为 MergedDictionaries 源文件。 从 Windows 8.1 开始的应用模板不再使用 StandardStyles.xaml。

ResourceDictionary 中 Style 定义的元素不需要具有 x:Key 属性x:Name 属性,这通常是 XAML 资源的要求。 以这种方式定义的 Style 使用其 TargetType 属性值作为隐式键,称为隐式样式。

有关如何使用 XAML 资源字典的详细信息,请参阅 ResourceDictionary 和 XAML 资源引用

样式和模板

可以使用 Style 中的 Setter 将值应用于任何依赖属性。 但它是控件派生类的 Template 属性的 Setter,它构成了典型 Style 中大部分 XAML 标记。 具有 Property="Template"Setter的 Value 几乎始终指定为包含 ControlTemplate 对象元素的属性元素。

使用 Style 定义控件模板时,Style 元素的 TargetType 及其 Control.Template setter 的 ControlTemplate 元素的 TargetType 应始终使用相同的值。

模板资源库为应用该模板的控件实例定义基本模板 UI 定义。 它还包含控件的视觉状态以及其他基于状态的 UI 定义,例如默认主题切换。 对于复杂控件(如 ListBox),默认模板 Style 和 中的 ControlTemplate 可以有数百行 XAML。 有关 Style 在控件模板化方案中的作用的详细信息,请参阅 XAML 控件模板

控件的模板通常包括更改控件外观以响应逻辑状态的视觉状态。 例如, 按钮 通过从其模板应用新的视觉状态来按下按钮时可以具有不同的视觉外观,并且所有外观更改都可以来自 XAML 而不是代码。 有关视觉状态如何工作以及如何修改它们或定义自定义控件的状态的详细信息,请参阅 视觉状态的情节提要动画XAML 控件模板

样式和运行时行为

可以更改在运行时由 Style 设置的各个属性的值,新值将覆盖 Setters 值。 例如,可以在运行时设置 Template 属性,即使此属性已由样式设置。

可以在运行时调整 Style 的属性,但前提是该样式尚未应用于任何内容,并且仅作为未隐式使用的资源存在。 例如,您可以向 资源 库中的集合添加资源库,该样式存在于 具有x:Key 属性 的资源中,但在 XAML 中的其他位置没有引用该样式的 {StaticResource} 标记扩展 值。 但是,一旦加载对象引用 Style 并将其用于值,就应将 Style 视为密封样式。 可以通过检查 Style 的 IsSealed 属性的值来检测密封状态。 如果 为 true,则表示样式已密封,你无法修改它的任何属性或 内部的 Setter 子值。 当引用样式的对象引发其 Loaded 事件时,还可以检测到样式投入使用和密封的时间点。

BasedOn 样式

你可以基于应用定义的现有样式或Windows 运行时控件的默认样式来生成新样式。 可以使用 BasedOn 属性执行此操作。 这减少了 XAML 中的重复,并使管理资源更加容易。 每个样式仅支持一个 BasedOn 样式。 有关详细信息,请参阅 BasedOn样式控件

隐式样式

可以定义样式,使同一 TargetType 的所有对象隐式使用 Style,而无需此类对象的每个实例专门引用 Style 作为 FrameworkElement.Style 值。 <Style>在没有 x:Key 属性ResourceDictionary 中声明资源时,x:Key 值使用 TargetType 属性的值。 如果隐式设置样式,则样式仅应用于与 TargetType 完全匹配的类型,而不应用于派生自 TargetType 值的元素。 例如,如果为应用程序中的所有 ToggleButton 控件隐式创建样式,并且应用程序具有 ToggleButtonCheckBox 控件, (CheckBox 派生自 ToggleButton) ,则“ToggleButton”隐式样式仅应用于 ToggleButton 控件。

XAML 语法说明

Setters 是 Style 的 XAML 内容属性,因此可以使用隐式集合语法,例如 <Style><Setter .../><Setter .../></Style>

在代码中使用 Style 类 (例如调用构造函数并逐个构建 Setter 值) 是非常罕见的。 样式用于模板,模板应在 XAML 加载时可用,因此在代码中创建的任何样式通常都为时已晚,无法应用于 UI 中的控件。

构造函数

Style()

初始化 Style 类的新实例,其中没有初始 TargetType 和空 的 Setters 集合。

Style(TypeName)

使用指定的初始 TargetType 和空的 Setters 集合初始化 Style 类的新实例。

属性

BasedOn

获取或设置一个作为当前样式的基准的已定义样式。

Dispatcher

获取与此 对象关联的 CoreDispatcherCoreDispatcher 表示可以访问 UI 线程上的 DependencyObject 的工具,即使代码是由非 UI 线程启动的。

(继承自 DependencyObject)
IsSealed

获取一个值,该值指示样式是否为只读(无法更改)。

Setters

获取 Setter 对象的集合。

TargetType

获取或设置样式所针对的类型。 如果未指定资源键,则 TargetType 可用于声明隐式样式资源。

方法

ClearValue(DependencyProperty)

清除依赖属性的本地值。

(继承自 DependencyObject)
GetAnimationBaseValue(DependencyProperty)

返回为依赖属性建立的任何基值,该基值适用于动画未处于活动状态的情况。

(继承自 DependencyObject)
GetValue(DependencyProperty)

DependencyObject 返回依赖属性的当前有效值。

(继承自 DependencyObject)
ReadLocalValue(DependencyProperty)

如果设置了本地值,则返回依赖属性的本地值。

(继承自 DependencyObject)
RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback)

注册一个通知函数,用于侦听此 DependencyObject 实例上特定 DependencyProperty 的更改。

(继承自 DependencyObject)
Seal()

锁定样式,以便无法更改 Setters 集合中的 TargetType 属性或任何 Setter

SetValue(DependencyProperty, Object)

设置 DependencyObject 上依赖属性的本地值。

(继承自 DependencyObject)
UnregisterPropertyChangedCallback(DependencyProperty, Int64)

取消以前通过调用 RegisterPropertyChangedCallback 注册的更改通知。

(继承自 DependencyObject)

适用于

另请参阅