Style.TargetType 属性

定义

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

public:
 property TypeName TargetType { TypeName get(); void set(TypeName value); };
TypeName TargetType();

void TargetType(TypeName value);
public System.Type TargetType { get; set; }
var typeName = style.targetType;
style.targetType = typeName;
Public Property TargetType As Type
<Style TargetType="typeName"/>

属性值

应用样式的对象类型。 此值通常在 XAML 中设置,而不是在代码中设置。 请参阅“备注”。

示例

此示例创建两种样式:一个用于 TextBlock ,一个用于 TextBox。 每个样式都应用于控件的两个实例,以便为每个 TextBlockTextBox 创建统一的外观。 该示例通过将 Style 引用为 {StaticResource} 标记扩展来设置每个控件的 FrameworkElement.Style 属性。

<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>

注解

对于使用或声明 Style 的所有情况,都需要 TargetType 值。 没有默认值。 即使是用作 FrameworkElement.Style 属性内联值的 Style 也需要显式 TargetType 值。

指定 TargetType 值的典型方法是通过 Style 元素上的 XAML 属性。 在 XAML 中设置时,TargetType 的含义和提供的值将涉及在 XAML 中表示类型的某些方面。

对于 XAML,通过 XAML 元素用法引用类型所需的任何前缀都应包含在 TargetType 属性值中。 例如,如果样式面向在映射到“local:”前缀的代码命名空间中定义的自定义类型,则该类型样式的 TargetType 属性值应包含类型名称前面的相同前缀。 此行为由Windows 运行时 XAML 分析器中的内置字符串类型转换行为启用。

定义自定义类型的样式时,在包含 TargetType 的映射前缀后,不会在该 Style 中任何 Setter属性值中包含任何前缀。

为 TargetType 提供的值修改在样式中指定的任何 Setter.Property 值的查找行为。 具体而言,按 Setter.Property XAML 属性值的名称引用的依赖属性应存在于 TargetType 类型或任何上级类中。 例如,如果指定的 TargetType 为 Button,并且 Style 中的 Setter.Property XAML 属性值之一是“Background”,则解析为 Control.Background 属性 (Control 在其类继承中比 Button 高三个级别,而 Button 继承 Control) 的所有属性。 通常,将 TargetType 值指定为在典型 UI 标记中使用的相同 UI 元素名称,但通常不会将上级类命名为 (尽管在技术上允许) 。

如果 Style 包含一个 Setter,该 Setter 声明控件模板 (模板属性) 的值,则父 Style 的 TargetType 值应与包含的 ControlTemplate 元素的 TargetType 值匹配。

隐式样式

样式几乎总是声明为 XAML 资源,这些资源将共享并应用于应用中引用该样式的每个 UI 元素。 若要声明为资源,所有 XAML 元素(包括 Style 元素)都必须在 resources 集合中具有一个键,用于区分每个资源以供在运行时查找。 Style 元素 (,各种模板元素(如 ControlTemplate) )支持称为隐式样式的功能。 对于隐式样式,为 TargetType 值提供的值也可用作其资源集合范围中该样式的键,无需指定 x:Key 属性值 。 (相比之下,在资源集合中声明的大多数其他元素都需要显式 的 x:Key 属性值 ,并且你会收到强制实施此的设计时或分析器错误。)

然后,使用隐式样式声明的样式将用作任何 UI 元素实例的 Style 值,该实例专门属于与隐式样式的 TargetType 匹配的类型。 控件不需要引用具有 Style 属性值的样式和对键的 {StaticResource} 标记扩展 引用来获取此行为,如果这些控件与现有隐式样式的类型匹配,则为隐式行为。

隐式样式不适用于作为 TargetType 值引用的类型子类型的元素。 例如,如果声明 ToggleButton 控件的隐式样式,并且应用具有 CheckBox 控件, (CheckBox 派生自 ToggleButton) ,则样式将专门应用于 ToggleButton 控件,但不适用于 CheckBox 控件。

Windows 运行时为属于Windows 运行时 API 的每个实际 UI 元素定义默认隐式样式。 它必须这样做,因为这些样式定义元素 (特别是模板) 的视觉对象,并且没有视觉对象的元素甚至不会显示在 UI 中或参与布局中。 所有这些隐式样式都可以在名为 generic.xaml 的设计帮助程序 XAML 文件中看到。 编辑 XAML 时,用于编辑 XAML 的工具可以将此文件的离散部分复制到应用的 XAML 中,作为编辑工具启用的样式副本的起点。 在默认隐式样式中,有许多资源引用层,以及使用 {ThemeResource} 标记扩展 和主题特定画笔或其他资源的主题支持。 可以替代来自定义默认隐式样式Windows 运行时的任何隐式样式。 有关详细信息,请参阅 快速入门:设置控件样式快速入门:控件模板

在代码中使用 TargetType

在代码中设置 TargetType 并不常见。 XAML 样式系统旨在通过将 XAML 加载为资源并事先准备好样式的所有方面来使用。 在运行时之前,应该很少有情况下,你不知道如何设置控件样式或应用样式的信息,在这种情况下,需要在代码中创建或引用的 样式 上设置 TargetType。

在代码中获取 TargetType 也很少见,但可能还会在少数情况下执行此操作。 例如,XAML 中可能已定义了一组命名 样式 资源。 但你可能想要双重检查,即要应用于控件的样式具有适用于要应用该样式的控件类型的 TargetType 值。 因此,你可能有如下所示的代码:

private bool VerifyStyle(FrameworkElement scope, String styleKey, Control applyTo)
{
    Style styleToCheck = scope.Resources[styleKey] as Style;
    if (styleToCheck != null)
    {
        if (styleToCheck.TargetType == applyTo.GetType())
        {
            // applyTo.Style = styleToCheck;
            return true;
        }
    }
    return false;
}

提示

如果使用 Microsoft .NET 语言 (C# 或 Microsoft Visual Basic) 进行编程, 则 TypeName 类型投影为 System.Type。 使用 C#C# 编程时,通常使用 typeof 运算符根据类型名称作为字符串获取对类型的 System.Type 的引用。 在 Microsoft Visual Basic 中,使用 GetType

迁移说明

  • 如果使用 XAML Windows Presentation Foundation (WPF) ,则可能已使用 x:Type 标记扩展来填充采用 System.Type 的任何 XAML 值。 Windows 运行时 XAML 分析程序不支持 x:Type。 相反,应在不使用任何标记扩展的情况下按名称引用类型,并且任何必要的 XAML 到后备类型转换已经由 XAML 分析器中的内置转换行为处理。

适用于