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宣告控制項範本 (Template屬性的值) ,則父Style的 TargetType 值應該符合所包含ControlTemplate元素的TargetType值。

隱含樣式

樣式幾乎一律宣告為 XAML 資源,這些資源會共用並套用至參考該樣式的應用程式中每個 UI 元素。 為了宣告為資源,所有包含 Style 元素的 XAML 元素都必須在資源集合中具有索引鍵,以區分每個資源在執行時間查閱。 Style元素 (,以及ControlTemplate) 等各種範本元素都支援稱為隱含樣式的功能。 針對隱含樣式,您為 TargetType 值提供的值也會做為其資源集合範圍中該樣式的索引鍵,而且您不需要指定 x:Key 屬性值 。 (相反地,您在資源集合內宣告的其他大部分元素都需要明確的 x:Key 屬性值 ,而且您會收到強制執行此設定的設計階段或剖析器錯誤。)

接著,使用隱含樣式宣告的樣式會作為任何特別屬於符合隱含樣式 TargetType 之型別之 UI 元素實例的 Style 值。 控制項不需要參考 Style 屬性值的 樣式 ,以及索引鍵的 {StaticResource} 標記延伸 參考來取得此行為,如果這些控制項符合現有的隱含樣式類型,則為隱含行為。

隱含樣式不適用於做為 TargetType 值參考之型別子類型的專案。 例如,如果您宣告 ToggleButton 控制項的隱含樣式,而且您的應用程式具有 CheckBox 控制項 (CheckBox 衍生自 ToggleButton) ,則樣式特別適用于 ToggleButton 控制項,但不適用於 CheckBox 控制項。

Windows 執行階段會針對屬於Windows 執行階段 API 一部分的每個實際 UI 元素定義預設的隱含樣式。 它必須這樣做,因為這些樣式會定義元素的視覺效果 (特別是範本) ,而且沒有任何視覺效果的專案甚至不會出現在 UI 中或參與版面配置。 所有這些隱含樣式都可以在名為 generic.xaml 的設計協助程式 XAML 檔案中看到。 您用來編輯 XAML 的工具可以將此檔案的離散部分複製到應用程式的 XAML 中,做為工具所啟用之樣式複本的起點。 在預設的隱含樣式中,有許多資源參考層,以及使用 {ThemeResource} 標記延伸 和主題特定筆刷或其他資源的主題支援。 您可以覆寫來自Windows 執行階段定義預設隱含樣式的任何隱含樣式。 如需詳細資訊,請參閱 快速入門:設定控制項樣式快速入門:控制項範本

在程式碼中使用TargetType

在程式碼中設定 TargetType 並不常見。 XAML 樣式系統旨在藉由將 XAML 載入為資源,並事先準備好樣式的所有層面來使用。 在執行時間之前,您應該很少知道如何設定控制項樣式或套用樣式的相關資訊,其中需要在程式碼中建立或參考的 Style 上設定 TargetType。

在程式碼中取得 TargetType 也並不常見,但您可能還有一些可能執行這項操作的案例。 例如,您的 XAML 中可能有一組已定義的具名 Style 資源。 但您可能想要仔細檢查您要套用至控制項的樣式是否有 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 對支援類型轉換。

適用於