Style.TargetType プロパティ
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
スタイルの対象となる型を取得または設定します。 リソース キーが指定されていない場合は、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 用の 2 つのスタイルを作成します。 各スタイルは、各 TextBlock と TextBox の外観を統一するために、コントロールの 2 つのインスタンスに適用 されます。 この例では、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 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>
注釈
Style を使用または宣言するすべてのケースでは、TargetType 値が必要です。 既定値はありません。 FrameworkElement.Style プロパティのインライン値として使用される Style であっても、明示的な TargetType 値が必要です。
TargetType 値を指定する一般的な方法は、 Style 要素の XAML 属性を使用することです。 XAML で設定すると、TargetType の意味と指定した値は、XAML での型の表現方法の一部の側面を考慮します。
XAML の場合、XAML 要素を使用して型を参照するために必要なプレフィックスは、TargetType 属性値に含める必要があります。 たとえば、"local:" プレフィックスにマップされるコード名前空間で定義されているカスタム型をスタイルが対象とする場合、その型のスタイルの TargetType 属性値には、型名の前に同じプレフィックスを含める必要があります。 この動作は、Windows ランタイム XAML パーサーの組み込みの文字列型変換動作によって有効になります。
カスタム型のスタイルを定義する場合、TargetType のマッピング プレフィックスを含めると、そのスタイル内の Setterの Property 値にプレフィックスは含まれません。
TargetType に指定する値は、スタイル内で指定した Setter.Property 値の参照動作を変更します。 具体的には、 Setter.Property XAML 属性値の名前で参照する依存関係プロパティは、TargetType 型または任意の先祖クラスに存在することが想定されます。 たとえば、指定した TargetType が Button で、Style の Setter.Property XAML 属性値の 1 つが "Background" の場合、Control.Background プロパティに解決されます (Control はクラス継承で Button の上に 3 レベル、Button は Control のすべてのプロパティを継承します)。 TargetType 値は、一般的な UI マークアップで使用するのと同じ UI 要素名として指定するのが一般的ですが、通常は先祖クラスという名前は付けられません (技術的には許可されています)。
Style にコントロール テンプレート (Template プロパティの値) を宣言する Setter が含まれている場合、親 Style の TargetType 値は、含まれている ControlTemplate 要素の TargetType 値と一致する必要があります。
暗黙的なスタイル
スタイルは、ほとんどの場合、共有され、そのスタイルを参照するアプリ内の各 UI 要素に適用される XAML リソースとして宣言されます。 リソースとして宣言するには、 Style 要素を含むすべての XAML 要素に、実行時に参照する各リソースを区別するキーがリソース コレクション内に存在する必要があります。 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 ランタイムから取得される暗黙的なスタイルをオーバーライドできます。 詳細については、「 クイック スタート: コントロールのスタイル設定 」および 「クイック スタート: コントロール テンプレート」を参照してください。
コードでの TargetType の使用
コードで TargetType を設定することは一般的ではありません。 XAML スタイル システムは、XAML をリソースとして読み込み、スタイルのすべての側面を事前に準備することで使用することを目的としています。 コード で作成または 参照されるスタイルに TargetType を設定する必要があるランタイムまで、コントロールのスタイルを設定する方法やスタイルを適用する方法に関する情報を知らないシナリオはほとんどありません。
コードで TargetType を取得することも一般的ではありませんが、これを行うシナリオがいくつかあります。 たとえば、XAML で既に定義されている名前付き Style リソースのセットがあるとします。 ただし、コントロールに適用しようとしているスタイルの 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;
}
ヒント
Microsoft .NET 言語 (C# または Microsoft Visual Basic) を使用してプログラミングする場合、 TypeName 型は System.Type としてプロジェクトされます。 C#C# を使用してプログラミングする場合、通常は typeof 演算子を使用して、型名に基づく型の System.Type への参照を文字列として取得します。 Microsoft Visual Basic で 、GetType を使用します。
移行に関する注意事項
- Windows Presentation Foundation (WPF) に XAML を使用している場合は、x:Type マークアップ拡張機能を使用して、System.Type を受け取る XAML 値を入力した可能性があります。 Windows ランタイム XAML パーサーは x:Type をサポートしていません。 代わりに、マークアップ拡張機能を使用せずに名前で型を参照する必要があります。必要な XAML からバッキング型への変換は、XAML パーサーの組み込みの変換動作によって既に処理されています。