Style クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
型のインスタンス間で共有できるプロパティ セッターが含まれています。
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>
- 継承
- 属性
例
次の使用例は、 TextBlock 用と TextBox 用の 2 つのスタイルを作成します。 各スタイルは、コントロールの 2 つのインスタンスに適用され、 TextBlock と TextBoxごとに均一な外観を作成します。 この例では、Styleを {StaticResource} マークアップ拡張として参照することで、各コントロールの FrameworkElement.Style プロパティを設定します。 この例では、リソース ディクショナリからスタイルを取得し、コード内のコントロールに適用する方法も示します。
各スタイルには複数の セッター パーツがあります。 この XAML では、 XAML プロパティ要素は表示されません。 これは、このプロパティの XAML での一般的な使用方法です。
Setters は Style の XAML コンテンツ プロパティであるため、Style.Setters値は暗黙的です。 XAML 構文の詳細と、XAML コンテンツ構文を使用して特定の XAML 要素を暗示および省略する方法については、 XAML 構文ガイドを参照してください。
TextBox のスタイルでは、Margin プロパティが 4 に設定されていることに注意してください。つまり、TextBoxはすべての辺に 4 の余白があります。 2 番目の TextBlock の長さを補うために、姓は名よりも小さいため、最初のTextBlockよりも短く、2 番目のTextBoxのMargin プロパティに値 "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 という名前のStyleに基づいて InheritedStyle という名前のStyleを作成します。
InheritedStyle は、BaseStyleからYellowのBackground値を継承し、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 値として参照する プロパティ は、依存関係プロパティである必要があります。
Styleを作成するときは、TargetType プロパティを設定する必要があります。 それ以外の場合は、例外がスローされます。
Style内の同じプロパティに値を直接設定した場合、要素に設定された値が直接優先されます。 詳細については、「 依存関係プロパティの概要」、具体的には「依存関係プロパティ値の優先順位」セクションを参照してください。
XAML リソースとしての スタイル の定義
Styleは、ほとんどの場合、XAML で ResourceDictionary のリソースとして定義されます。
- 同じ XAML ページで定義されている他の UI 項目でのみ使用される
Styleの場合は、通常、FrameworkElement.Resources コレクションで Style を定義します (ルート要素が Page の場合Page.Resources)。 - アプリ内の複数のページで使用される
Styleの場合は、通常、 Application.Resources コレクションでスタイルを定義します。 または、Application.Resourcesに MergedDictionaries 値として含めるアプリ用の別の XAML ファイルがある場合もあります。 - ほとんどの UI 要素には、Windows ランタイムによって定義される既定のスタイルがあります。 既定のスタイルのコピーは、 generic.xaml と呼ばれるデザイン ヘルパー XAML ファイルで確認できます。これは、技術的にはアプリのリソース ファイルではありませんが、1 つのような構造になっています。 ツールで有効になっているスタイルのコピーを編集する際の開始点として、このファイルの個別の部分をアプリの XAML にコピーできますが、そのようなコピーを作成したら、 リソース コレクションのいずれかに含めるか、 MergedDictionaries を介して間接的にアクセスする必要があります。 これらすべての場合、既定値をオーバーライドする変更された XAML がアプリの一部として含まれます。
ResourceDictionary のStyle定義された要素は、x:Key 属性または x:Name 属性を持つ必要はありません。これは通常、XAML リソースであることが必要です。 この方法で定義された Style は、 その TargetType プロパティ値を暗黙的なキーとして使用し、暗黙的なスタイルと呼ばれます。
XAML リソース ディクショナリの使用方法の詳細については、「 ResourceDictionary および XAML リソース参照」を参照してください。
スタイルとテンプレート
Styleで Setter を使用して、任意の依存関係プロパティに値を適用できます。 ただし、一般的なStyleの XAML マークアップの大部分を構成するのは、コントロール派生クラスの Template プロパティのSetterです。
Property="Template"を持つSetterの値は、ほとんどの場合、ControlTemplate オブジェクト要素を含むプロパティ要素として指定されます。
Styleを使用してコントロール テンプレートを定義する場合、Style要素の TargetType とその Control.Template setter の ControlTemplate 要素の TargetType は常に同じ値を使用する必要があります。
テンプレート セッターは、そのテンプレートが適用されるコントロール インスタンスの基本的なテンプレート UI 定義を定義します。 また、コントロールの表示状態や、既定のテーマ切り替えなどの状態ベースの UI 定義も含まれます。
ListBox などの複雑なコントロールの場合、既定のテンプレート Style と ControlTemplate 内には数百行の XAML を含めることができます。 コントロール テンプレートのシナリオにおける Style の役割の詳細については、「 XAML コントロール テンプレート」を参照してください。
多くの場合、コントロールのテンプレートには、論理状態に応じてコントロールの外観を変更する表示状態が含まれています。 たとえば、ボタンのテンプレートから新しい表示状態を適用することで、 ボタン が押されたときに外観が異なる場合があり、外観の変更はすべてコードではなく XAML から行うことができます。 ビジュアルの状態のしくみと、それらを変更する方法、またはカスタム コントロールの状態を定義する方法の詳細については、「 XAML コントロール テンプレート」を参照してください。
スタイルとランタイムの動作
実行時に Style によって設定された個々のプロパティの値を変更でき、新しい値によって Setters の値が上書きされます。 たとえば、このプロパティがスタイルによって設定されている場合でも、実行時に Template プロパティを設定できます。
実行時に Style のプロパティを調整できますが、そのスタイルが何にも適用されておらず、暗黙的に使用されていないリソースとしてのみ存在する場合に限られます。 たとえば、x:Key 属性を持つリソースに存在するが、そのスタイルを参照する XAML の他の場所に {StaticResource} マークアップ拡張値がないスタイルのセッターを Setters のコレクションに追加できます。 ただし、読み込まれたオブジェクトによって Style が参照され、値に使用されるとすぐに、 Style はシールされていると見なされる必要があります。
Styleの IsSealed プロパティの値を確認することで、シール状態を検出できます。
trueされている場合、スタイルはシールされ、その中のプロパティや Setter サブ値を変更することはできません。 スタイルが使用され、シールされた時点は、 Style が参照されているオブジェクトで Loaded イベントが発生したときにも検出できます。
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 構文に関する注意事項
セッター は Styleの XAML コンテンツ プロパティであるため、 <Style><Setter .../><Setter .../></Style>などの暗黙的なコレクション構文を使用できます。
コードで Style クラスを使用することは非常にまれです (コンストラクターを呼び出して Setter 値を 1 つずつ構築するなど)。 スタイルはテンプレートに使用され、テンプレートは XAML 読み込み時に使用できるようにする必要があるため、コードで作成された Style は通常、UI のコントロールに適用するには遅すぎます。
コンストラクター
| 名前 | 説明 |
|---|---|
| Style() |
初期の TargetType および空の Setters コレクションを使用せず、Style クラスの新しいインスタンスを初期化します。 |
| Style(TypeName) |
指定した初期 TargetType と空の Setters コレクションを使用して、Style クラスの新しいインスタンスを初期化します。 |
プロパティ
| 名前 | 説明 |
|---|---|
| BasedOn |
現在のスタイルの基礎となる定義済みのスタイルを取得または設定します。 |
| Dispatcher |
Windows アプリ SDK アプリで常に |
| DispatcherQueue |
このオブジェクトが関連付けられている |
| IsSealed |
スタイルが読み取り専用であり、変更できないかどうかを示す値を取得します。 |
| Setters |
Setter オブジェクトのコレクションを取得します。 |
| 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) |