語言

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

備註

所有使用或宣告風格的情況都必須有一個TargetType值。 沒有預設值。 即使是 Style 作為 FrameworkElement.Style 屬性內嵌值的 ,也需要明確的 TargetType 值。

典型 TargetType 的指定值方式是透過 Style 元素上的 XAML 屬性。 在 XAML 中設定時,的 TargetType 意義和你提供的值會與 XAML 中型別的表示方式有所不同。

對於 XAML,屬性值中應包含 TargetType 任何透過 XAML 元素使用來指涉型別所需的前綴。 例如,如果一個樣式針對一個自訂型別,而該型別定義在一個映射到「local:」前綴的代號空間中,那麼 TargetType 該型別的樣式屬性值應該包含該型別名稱前的相同前綴。 此行為由 Windows 執行階段 XAML 解析器內建的字串類型轉換行為所實現。

在為自訂類型定義風格時,一旦你已經為 a TargetType 加入了映射前綴,就不會在該類型中任何 Setter 的屬性值中加入任何前綴。

你提供的 TargetType 值會修改你在樣式中指定的任何 Setter.Property 值的查找行為。 具體來說,你用名稱 Setter.Property 參考 XAML 屬性值的相依屬性,預期會存在於該 TargetType 類型或任何祖先類別上。 舉例來說,如果你指定 Button TargetType 是 Button,而 Style 裡的 XAML 屬性值Setter.Property之一是「Background」,那就會解析成 Control.Background 屬性(Control 在類別繼承上比 Button 高三級,並且Button繼承了 Control 的所有屬性)。 通常會指定 TargetType 與一般 UI 標記中使用相同的 UI 元素名稱,通常不會命名祖先類別(雖然技術上允許)。

如果 Style 包含一個宣告控制範本的 Setter(Template 屬性的值),那麼TargetType父 Style 的值應該會與所包含的 ControlTemplate 元素的 TargetType 值相符。

隱含風格

樣式幾乎總是被宣告為 XAML 資源,這些資源會被共享並套用到應用程式中參考該樣式的每個 UI 元素。 為了被宣告為資源,所有 XAML 元素(包括 Style 元素)必須在資源集合中有一個鍵,能區分執行時查詢的每個資源。 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 執行階段 預設隱式樣式的隱式樣式。 欲了解更多資訊,請參閱 XAML 樣式 與 XAML 控制範本。

在程式碼中使用 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;
}

Tip

如果你是用 C# 來寫程式, TypeName 類型會投射為 System.Type。 使用 C# 程式時,通常會用運算 typeof 子根據字串的型別名稱取得 的 System.Type 參考。

移轉注意事項

  • 如果你曾使用 XAML 來支援 Windows Presentation Foundation(WPF),那麼你可能已經使用 x:Type 標記擴充功能來填補任何使用 System.Type 的 XAML 值。 Windows 執行階段 XAML 解析器不支援 x:Type。 相反地,你應該以名稱來指代型別,且不使用任何標記擴充功能,且任何必要的 XAML 到後台型別轉換,已經由 XAML 解析器內建的轉換行為處理。

適用於