Style クラス

定義

型のインスタンス間で共有できるプロパティ セッターを含みます。 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 用の 2 つのスタイルを作成します。 各スタイルは、コントロールの 2 つのインスタンスに適用され、 と TextBoxのそれぞれにTextBlock均一な外観が作成されます。 この例では、 を {StaticResource} マークアップ拡張機能として参照Styleすることで、各コントロールの FrameworkElement.Style プロパティを設定します。 この例では、リソース ディクショナリからスタイルを取得し、コード内のコントロールに適用する方法も示します。

各スタイルには複数の セッター パーツがあります。 この XAML では、XAML プロパティ要素は表示されません Style.Setters 。 これは、このプロパティの XAML での一般的な使用法です。 Setters は Style の XAML コンテンツ プロパティであるため、値はStyle.Setters暗黙的です。 XAML 構文の詳細と、XAML コンテンツ構文を使用して特定の XAML 要素を暗示および省略する方法については、 XAML 構文ガイドを参照してください。

TextBox のスタイルでは、Margin プロパティが 4 に設定されていることに注意してください。つまり、 は、すべての辺に 4 の余白があることを意味TextBoxします。 2 番目の TextBlock の長さを補うために、First Name よりも小さいため、最初TextBlockTextBlock よりも短いため、2 番目TextBoxの の プロパティに値 "6,4,4,4" が割り当てられますMargin。 これにより、2 番目 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);
}

次の使用例は、2 つのスタイル要素を作成します。 TargetType最初のスタイル要素の は にTextBox設定され、TargetType2 番目のスタイル要素の は に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名前付き BaseStyle に基づいて InheritedStyle という名前の をStyle作成します。 InheritedStyle は の値YellowBackground継承BaseStyleし、 のRed値をForeground追加します。

<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は基本的に、このようなプロパティを持つ特定の型の 1 つ以上のインスタンスに適用されるプロパティ設定のコレクションです。 には Style 、1 つ以上の Setter オブジェクトのコレクションが含まれます。 それぞれにSetterプロパティがあります。 Propertyは、スタイルが適用される要素のプロパティの名前です。 Valueは、 プロパティに適用される値です。

を適用 Styleするには、ターゲット オブジェクトが DependencyObject である必要があります。 各 Setter が Property 値として参照する プロパティ は、依存関係プロパティである必要があります。

を作成するときは、 TargetType プロパティを設定する Style必要があります。 それ以外の場合は、例外がスローされます。

内の同じプロパティ Style に値を設定し、要素に直接設定した場合は、要素に設定された値が直接優先されます。 詳細については、「 依存関係プロパティの概要」、具体的には「依存関係プロパティの値の優先順位」セクションを参照してください。

XAML リソースとしての スタイル の定義

Styleは、ほとんどの場合、XAML で ResourceDictionary のリソースとして定義されます。

  • Style同じ XAML ページで定義されている他の UI 項目でのみ使用される の場合は、通常、FrameworkElement.Resources コレクション (ルート要素が Page の場合)Page.Resources で Style を定義します。
  • Styleアプリ内の複数のページで使用される の場合は、通常、Application.Resources コレクションで Style を定義します。 または、MergedDictionaries 値として含めるアプリ用の別の Application.Resources XAML ファイルを用意することもできます。
  • ほとんどの UI 要素には、Windows ランタイムによって定義される既定のスタイルがあります。 既定のスタイルのコピーは、 generic.xaml と呼ばれるデザイン ヘルパー XAML ファイルで確認できます。これは、技術的にはアプリのリソース ファイルではありませんが、1 つのように構造化されています。 ツールで有効になっているスタイルのコピーを編集するときに、このファイルの個別の部分をアプリの XAML にコピーすることができますが、このようなコピーを作成したら、 Resources コレクションのいずれかに含めるか、 MergedDictionaries を通じて間接的にアクセスする必要があります。 このような場合はすべて、既定値をオーバーライドする変更された XAML がアプリの一部として含まれます。

StyleResourceDictionary で定義された要素は、通常は XAML リソースの要件である x:Key 属性または x:Name 属性を持つ必要はありません。 この方法で定義された は Styleその TargetType プロパティ値を暗黙的なキーとして使用し、暗黙的なスタイルと呼ばれます。

XAML リソース ディクショナリの使用方法の詳細については、「 ResourceDictionary および XAML リソース参照」を参照してください

スタイルとテンプレート

Setter を使用して、任意の Style 依存関係プロパティに値を適用できます。 Setterただし、一般的Styleな の XAML マークアップの大部分を構成するのは、Control 派生クラスの Template プロパティの です。 の ValueSetterProperty="Template" は、ほとんどの場合、 ControlTemplate オブジェクト要素を含むプロパティ要素として指定されます。

Styleを使用してコントロール テンプレートを定義する場合、Control.Template セッターの要素の StyleTargetTypeControlTemplate 要素の TargetType は常に同じ値を使用する必要があります。

テンプレート セッターは、そのテンプレートが適用されるコントロール インスタンスの基本的なテンプレート UI 定義を定義します。 また、コントロールの表示状態と、既定のテーマの切り替えなどの他の状態ベースの UI 定義も含まれます。 ListBox などの複雑なコントロールの場合、既定のテンプレート Style と 内の ControlTemplate には、数百行の XAML を含めることができます。 コントロール テンプレートのシナリオでの の Style 役割の詳細については、「 XAML コントロール テンプレート」を参照してください。

多くの場合、コントロールのテンプレートには、論理状態に応じてコントロールの外観を変更する視覚的な状態が含まれています。 たとえば、 Button を 押したときに、そのテンプレートから新しいビジュアル状態を適用すると、外観が異なる場合があり、すべての外観の変更はコードではなく XAML から行うことができます。 ビジュアル状態のしくみと、それらを変更する方法、またはカスタム コントロールの状態を定義する方法の詳細については、「 XAML コントロール テンプレート」を参照してください。

スタイルとランタイムの動作

実行時に によって Style 設定された個々のプロパティの値を変更でき、新しい値によって Setters 値が上書きされます。 たとえば、このプロパティがスタイルによって設定されている場合でも、実行時に Template プロパティを設定できます。

のプロパティ Style は実行時に調整できますが、そのスタイルが何にも適用されておらず、暗黙的に使用されていないリソースとしてのみ存在する場合に限られます。 たとえば、x:Key 属性を持つ Resources に存在するが、そのスタイルを参照する XAML の他の場所に {StaticResource} マークアップ拡張値がないスタイルについては、Setters のコレクションにセッターを追加できます。 ただし、読み込まれたオブジェクトによって Style が参照され、値に使用されるとすぐに、 は Style シールされていると見なされます。 シール状態は、 の IsSealed プロパティ Styleの値を確認することで検出できます。 の場合、 trueスタイルはシールされ、その中のプロパティや Setter サブ値を変更することはできません。 スタイルが使用され、シールされた時点は、 が参照されているオブジェクトによって Loaded イベントがStyle発生したときにも検出できます。

BasedOn スタイル

アプリで定義されている既存のスタイル、またはWindows ランタイム コントロールの既定のスタイルに基づいて、新しいスタイルを作成できます。 これを行うには、 BasedOn プロパティを使用します。 これにより、XAML の重複が軽減され、リソースの管理が容易になります。 各スタイルでは、1 つの BasedOn スタイルのみがサポートされます。 詳細については、「 BasedOn コントロール」または「 スタイル コントロール」を参照してください。

暗黙的なスタイル

同じ TargetType のすべてのオブジェクトで が暗黙的に使用されるようにStyleスタイルを定義できます。このようなオブジェクトの各インスタンスが Style を FrameworkElement.Style 値として明示的に参照する必要はありません。 リソースが <Style>x:Key 属性なしで ResourceDictionary で宣言されている場合、x:Key 値は プロパティの値をTargetType使用します。 スタイルを暗黙的に設定した場合、スタイルは、値からTargetType派生した要素ではなく、正確に一致TargetTypeする型にのみ適用されます。 たとえば、アプリケーション内のすべての ToggleButton コントロールに対してスタイルを暗黙的に作成し、アプリケーション ToggleButtonおよび CheckBox コントロール (CheckBox から ToggleButton派生) がある場合、"ToggleButton" 暗黙的なスタイルはコントロールにのみ ToggleButton 適用されます。

XAML 構文に関する注意事項

セッター は の XAML コンテンツ プロパティ Styleであるため、 などの <Style><Setter .../><Setter .../></Style>暗黙的なコレクション構文を使用できます。

コードで クラスを Style 使用する (コンストラクターを呼び出して Setter 値を 1 つずつ構築するなど) ことは非常にまれです。 スタイルはテンプレートに使用され、テンプレートは XAML 読み込み時に使用できるようにする必要があるため、コードで作成された Style テンプレートは通常、UI のコントロールに適用するには遅すぎます。

コンストラクター

Style()

初期 TargetType および空の Setters コレクションを使用して、Style クラスの新しいインスタンスを初期化します。

Style(TypeName)

指定した初期 TargetType コレクションと空の Setters コレクションを使用して、Style クラスの新しいインスタンスを初期化します。

プロパティ

BasedOn

現在のスタイルの基になる定義済みのスタイルを取得または設定します。

Dispatcher

常に Windows アプリ SDK アプリで を返しますnull。 代わりに DispatcherQueue を使用してください。

(継承元 DependencyObject)
DispatcherQueue

このオブジェクトが DispatcherQueue 関連付けられている を取得します。 は DispatcherQueue 、コードが UI 以外のスレッドによって開始された場合でも、UI スレッド上の にアクセス DependencyObject できる機能を表します。

(継承元 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)

適用対象

こちらもご覧ください