Style クラス

定義

型のインスタンス間で共有できるプロパティ セッターを含みます。 Style は通常、リソース コレクションで宣言されるため、コントロール テンプレートやその他のスタイルを適用するために共有および使用できます。

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

Windows の要件

デバイス ファミリ
Windows 10 (10.0.10240.0 で導入)
API contract
Windows.Foundation.UniversalApiContract (v1.0 で導入)

この例では、2 つのスタイルを作成します。1 つは TextBlock 用、もう 1 つは TextBox 用です。 各スタイルは、コントロールの 2 つのインスタンスに適用され、 TextBlock と TextBox ごとに均一な外観が作成 されます。 この例では、Style を {StaticResource} マークアップ拡張として参照することで、各コントロールの FrameworkElement.Style プロパティを設定します。 この例では、リソース ディクショナリからスタイルを取得し、コード内のコントロールに適用する方法も示しています。

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

TextBox のスタイルでは、Margin プロパティが 4 に設定されていることに注意してください。つまり、TextBox の両側の余白は 4 です。 2 番目の TextBlock の長さを補うために、姓は First Name よりも小さいため、最初TextBlock よりも短く、2 番目の TextBoxMargin プロパティに値 "6,4,4,4" が割り当てられます。 これにより、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 に設定され、2 番目のスタイル要素の TargetType は Button に設定されます。 これらは、TextBox コントロールと Button コントロールの暗黙的なスタイルとして適用されます。

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

次の使用例は、BaseStyle という名前のスタイルに基づいて、InheritedStyle という名前のスタイルを作成します。 InheritedStyle は、BaseStyle から Background の値 Yellow を継承し、前景色の値として赤を追加します。

<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 オブジェクトのコレクションが含まれています。 各 セッター には、 プロパティがあります。 Property は、スタイルが適用される要素のプロパティの名前です。 Value は、 プロパティに適用される値です。

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

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

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

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

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

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

Windows 8 Windows 8 XAML で既存のコントロールを再テンプレート化する場合は、開始するほとんどのアプリ テンプレートに含まれている StandardStyles.xaml XAML ファイルに存在する Style 要素を変更することがあります。 StandardStyles.xaml は、template app.xaml ファイルによって MergedDictionaries ソース ファイルとして参照されます。 Windows 8.1 以降のアプリのテンプレートでは、StandardStyles.xaml は使用されなくなりました。

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

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

スタイルとテンプレート

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

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

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

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

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

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

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

BasedOn スタイル

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

暗黙的なスタイル

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

XAML 構文に関する注意事項

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

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

コンストラクター

Style()

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

Style(TypeName)

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

プロパティ

BasedOn

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

Dispatcher

このオブジェクトが関連付けられている CoreDispatcher を取得します。 CoreDispatcher は、コードが 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)

適用対象

こちらもご覧ください