語言

Style 類別

定義

包含可在某類型實例間共享的屬性設定器。 A Style 通常在資源集合中宣告,以便分享並用於套用控制範本及其他樣式。

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

範例

此範例會產生兩種樣式:一種用於 TextBlock ,另一種用於 TextBox。 每個樣式套用到兩個控制項實例,以建立統一TextBlockTextBox的外觀。 範例中透過Style引用 {StaticResource} 標記擴充功能,設定每個控制項的 FrameworkElement.Style 屬性。 範例也展示了如何從資源字典取得樣式並將其套用到程式碼中的控制項。

每種風格都有多個 二傳 手部位。 在此 XAML 中,不 Style.Setters 會出現任何 XAML 屬性元素。 這是 XAML 中此特性的典型用法。 這個 Style.Setters 值是隱含的,因為 Setters 是 Style 的 XAML 內容屬性。 欲了解更多關於 XAML 語法的資訊,以及 XAML 內容語法如何讓某些 XAML 元素可以蘊含或省略,請參閱 XAML 語法指南。

注意在 TextBox 的樣式中, 邊界 屬性設為 4,表示邊 TextBox 界各邊都是 4。 為了補償第二個 TextBlock 的長度,因為 Last Name 佔用的空間比 First Name 少,第二個 TextBlockTextBlock 的長度TextBox被賦予「6,4,4,4」這個值。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第一個樣式元素的 設TextBoxTargetType為 ,第二個樣式元素Button的 設為 。 這些接著被應用為控制項與Button控制項的隱含風格TextBox。

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

這個範例會建立一個 Style 名為 InheritedStyle ,該格式是基於一個 Style 已命名的 BaseStyle。 InheritedStyle 繼Background承了 的Yellow值,BaseStyle並加上 Foreground 的值。Red

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

備註

A Style 基本上是一套屬性設定的集合,套用在一個或多個具有此類屬性的特定類型實例上。 A Style 包含一個或多個 Setter 物件的集合。 每個 Setter 都有一個 屬性 和 一個價值。 是 Property 套用該樣式所屬元素屬性的名稱。 是 Value 應用於該財產的價值。

要套用 , Style目標物件必須是 DependencyObject。 每個 設定者 所參考的 屬性 值必須是相依屬性屬性。

建立 Style. 否則會拋出例外。

如果你在 A Style 和元素中都設定同一屬性的值,直接設定在元素上的值會優先。 欲了解更多資訊,請參閱 相依性屬性總覽,特別是「相依性不動產價值優先順序」章節。

定義 樣式 為 XAML 資源

A Style 幾乎總是在 XAML 中定義為 ResourceDictionary 中的資源。

  • 對於 Style 只被同一 XAML 頁面中其他 UI 項目使用的 Style,通常你會在 FrameworkElement.Resources 集合中定義 Style(Page.Resources 如果你的根元素是 Page)。
  • 對於應用程式中多個頁面使用的 , Style 通常會在 Application.Resources 集合中定義 Style。 或者,你也可以為應用程式準備一個獨立的 XAML 檔案,作為 MergedDictionaries 的值加入Application.Resources。
  • 大多數 UI 元素都有由 Windows 執行階段 定義的預設樣式。 預設樣式的副本可以在設計輔助的 XAML 檔案 generic.xaml 中看到,雖然結構上類似,但技術上不是應用程式的資源檔。 你可以將這個檔案的離散部分複製到應用程式的 XAML 中,作為編輯工具啟用樣式副本的起點,但一旦複製完,必須包含在 資源集合中 ,或透過 MergedDictionariies 間接存取。 在這些情況下,覆蓋預設的修改過的 XAML 會包含在你的應用程式中。

Style ResourceDictionary 中定義的元素不要求具備 x:Key 屬性或 x:Name 屬性,這通常是成為 XAML 資源的必要條件。 以此方式定義的 A Style 會使用其 TargetType 屬性值作為隱含鍵,稱為隱式樣式。

欲了解更多如何使用 XAML 資源字典的資訊,請參閱 ResourceDictionary 與 XAML 資源參考。

樣式和模板

你可以在 A Style 裡用 Setter 來對任何相依屬性套用值。 但在典型 Style的 中,佔據 XAML 標記的主要部分,是 SetterControl 衍生類別的 Template 屬性。 一個 的 Property="Template"ValueSetter 幾乎總是指定為包含 ControlTemplate 物件元素的屬性元素。

當 a Style 被用來定義控制範本時,該元素的 StyleTargetType 與 ControlTemplate 元素的 TargetType 應始終使用相同的值。

模板設定器定義了套用該範本的控制實例的基本模板 UI 定義。 它也包含控制項的視覺狀態,以及其他基於狀態的 UI 定義,例如預設主題轉換。 對於像 ListBox 這樣複雜的控制項,預設範本 Style 和其中的 ControlTemplate 可以包含數百行 XAML。 欲了解更多關於控制範本場景中角色 Style 的資訊,請參閱 XAML 控制範本。

控制項的範本通常包含視覺狀態,這些狀態會根據邏輯狀態改變控制項的外觀。 例如,按鈕在從模板套用新的視覺狀態 時,可能會 呈現不同的視覺外觀,所有外觀變更都可能來自 XAML,而非程式碼。 關於視覺狀態的運作方式以及如何修改或定義自訂控制的狀態,請參見 XAML 控制範本。

樣式與執行時行為

你可以在執行時更改由 A Style 設定的個別屬性值,然後你的新值會覆蓋 Setters 的值。 例如,即使這個屬性是由樣式設定的,你也可以在執行時設定 Template 屬性。

你可以在執行時調整 a Style 的屬性,但前提是該樣式尚未被套用到任何東西上,且僅作為一個資源存在且未被隱含使用。 舉例來說,你可以在 Setters 裡為 Resources 裡的風格加入 setter,該風格在 Resources 裡有 x:Key 屬性 ,但在 XAML 其他地方沒有 {StaticResource} 標記擴充 值來參考該樣式。 然而,一旦樣式被載入物件 Style 引用並用於值,該樣式就應視為封存。 你可以透過檢查 IsSealed 屬性 Style的價值來偵測密封狀態。 如果是 true,那樣式就封存了,你無法修改它或 Setter 子值的任何屬性。 當被參考的物件 Style 觸發 Loaded 事件時,也能偵測到樣式被使用並封存的時間點。

BasedOn 風格

你可以根據現有的應用程式定義的樣式,或是預設的 Windows 執行階段 控制項樣式來建立新樣式。 你可以使用 BasedOn 屬性來達成此功能。 這減少了 XAML 的重複,也讓資源管理變得更容易。 每種風格只支援一種 BasedOn 風格。 更多資訊請參見 BasedOn 或 Styling 控制項。

隱含風格

你可以定義樣式,使得所有同一 TargetType 的物件都隱含使用 a Style ,而不必要求每個物件實例都特別引用 Style,作為 FrameworkElement.Style 值。 當 <Style> 資源在 ResourceDictionary 中宣告但未設定 x:Key 屬性時, x:Key 值會使用該 TargetType 屬性的值。 如果你隱含設定樣式,樣式只會套用在完全匹配 TargetType 的類型上,不會套用到從 TargetType 該值衍生出的元素。 舉例來說,如果你隱含地為應用程式中所有 ToggleButton 控制項建立樣式,且應用程式有 ToggleButton 和 CheckBox 控制項(CheckBox 源自 ToggleButton),「ToggleButton」隱含樣式只會套用在控制項上 ToggleButton 。

XAML 語法說明

Setters 是 的 StyleXAML 內容屬性,因此你可以使用隱含的集合語法,例如 <Style><Setter .../><Setter .../></Style>。

在程式碼中使用這個 Style 類別(例如呼叫建構子並逐一建立 Setter 值)非常罕見。 樣式用於範本,範本應在 XAML 載入時可用,因此 Style 程式碼中建立的樣式通常太晚,無法套用到 UI 的控制項。

建構函式

名稱 Description
Style()

初始化一個新的 Style 類別實例,沒有初始 TargetType ,且 Setters 集合為空。

Style(TypeName)

初始化一個新的 Style 類別實例,設定指定的初始 TargetType 及空的 Setters 集合。

屬性

名稱 Description
BasedOn

取得或設定一個定義的風格,作為當前風格的基礎。

Dispatcher

它總是在 Windows 應用程式 SDK 應用程式中回傳 null 。 改用 DispatcherQueue 。

(繼承來源 DependencyObject)
DispatcherQueue

得到 DispatcherQueue 這個物件所關聯的那個。 代表 DispatcherQueue 一個功能,即使程式碼是由非 UI 執行緒發起,也能存取 UI DependencyObject 執行緒。

(繼承來源 DependencyObject)
IsSealed

會取得一個值,表示樣式是否為唯讀且無法更改。

Setters

獲得一組 Setter 物品。

TargetType

取得或設定該樣式所指的類型。 TargetType 若未指定資源鍵,可用來宣告隱式樣式資源。

方法

名稱 Description
ClearValue(DependencyProperty)

清除依賴性財產的局部價值。

(繼承來源 DependencyObject)
GetAnimationBaseValue(DependencyProperty)

回傳任何為相依屬性建立的基礎值,適用於動畫未啟用時。

(繼承來源 DependencyObject)
GetValue(DependencyProperty)

回傳 DependencyObject 中相依屬性的當前有效值。

(繼承來源 DependencyObject)
ReadLocalValue(DependencyProperty)

若設定了本地值,則回傳依賴性質的局部值。

(繼承來源 DependencyObject)
RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback)

註冊一個通知函式,用於監聽此 DependencyObject 實例中特定 DependencyProperty 的變更。

(繼承來源 DependencyObject)
Seal()

鎖定風格,使得 TargetType 屬性或 Setters 集合中的任何 Setter 都無法更改。

SetValue(DependencyProperty, Object)

將相依屬性的局部值設定在 DependencyObject 上。

(繼承來源 DependencyObject)
UnregisterPropertyChangedCallback(DependencyProperty, Int64)

取消先前透過呼叫 RegisterPropertyChangedCallback 註冊的變更通知。

(繼承來源 DependencyObject)

適用於

另請參閱