Style.TargetType プロパティ

定義

スタイルの対象となる型を取得または設定します。 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 つのスタイルを作成します。 各スタイルは、コントロールの 2 つのインスタンスに適用され、 TextBlockTextBoxごとに均一な外観を作成します。 この例では、スタイルを {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 Bottom.-->
    <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>

注釈

スタイルを使用または宣言するすべてのケースには、TargetType値が必要です。 既定値はありません。 FrameworkElement.Style プロパティのインライン値として使用されるStyleでも、明示的なTargetType値が必要です。

TargetType値を指定する一般的な方法は、Style 要素の XAML 属性を使用することです。 XAML で設定する場合、 TargetType の意味と指定する値は、XAML での型の表現方法の一部の側面を取ります。

XAML の場合、XAML 要素を使用して型を参照するために必要なプレフィックスは、 TargetType 属性値に含める必要があります。 たとえば、スタイルが "local:" プレフィックスにマップされているコード名前空間で定義されているカスタム型を対象とする場合、その型のスタイルの TargetType 属性値には、型名の前に同じプレフィックスを含める必要があります。 この動作は、Windows ランタイム XAML パーサーの組み込みの文字列型変換動作によって有効になります。

カスタム型のスタイルを定義するときに、TargetTypeのマッピング プレフィックスを含めた後は、そのスタイル内の SetterProperty 値にプレフィックスを含めないでください。

TargetTypeに指定した値は、スタイル内で指定した Setter.Property 値の参照動作を変更します。 具体的には、 Setter.Property XAML 属性値の名前で参照する依存関係プロパティは、 TargetType 型または任意の先祖クラスに存在する必要があります。 たとえば、指定したTargetTypeButton で、スタイルSetter.Property XAML 属性値の 1 つが "Background" の場合、Control.Background プロパティに解決されます (Control はクラス継承の Button の上の 3 つのレベルで、ButtonControl のすべてのプロパティを継承します)。 通常、 TargetType 値を一般的な UI マークアップで使用するのと同じ UI 要素名に指定します。通常は先祖クラスに名前を付けることはできません (技術的には許可されています)。

コントロール テンプレート (Template プロパティの値) を宣言する SetterStyle に含まれている場合、親 StyleTargetType値は、含まれている ControlTemplate 要素の TargetType 値と一致する必要があります。

暗黙的なスタイル

スタイルは、ほとんどの場合、共有され、そのスタイルを参照するアプリ内の各 UI 要素に適用される XAML リソースとして宣言されます。 リソースとして宣言するには、 Style 要素を含むすべての XAML 要素に、実行時に参照する各リソースを区別するキーがリソース コレクション内に必要です。 Style 要素 (および ControlTemplate などのさまざまなテンプレート要素) は、暗黙的なスタイルと呼ばれる機能をサポートします。 暗黙的なスタイルの場合、 TargetType 値に指定した値は、そのリソース コレクション スコープでそのスタイルのキーとしても機能し、 x:Key 属性値 を指定する必要はありません。 (これに対して、リソース コレクション内で宣言する他のほとんどの要素には明示的な x:Key 属性値 が必要であり、これを強制するデザイン時またはパーサー エラーが発生します)。

暗黙的なスタイルを使用して宣言されたスタイルは、暗黙的なスタイルのTargetTypeに一致する型である UI 要素インスタンスの Style 値として使用されます。 この動作を取得するために、コントロールは Style 属性値と {StaticResource} マークアップ拡張 参照を持つスタイルを参照する必要はありません。これらのコントロールが既存の暗黙的なスタイルの型と一致する場合は暗黙的な動作です。

暗黙的なスタイルは、 TargetType 値として参照される型のサブタイプである要素には適用されません。 たとえば、 ToggleButton コントロールの暗黙的なスタイルを宣言し、アプリに CheckBox コントロール (CheckBoxToggleButtonから派生) がある場合、スタイルは特に ToggleButton コントロールに適用されますが、 CheckBox コントロールには適用されません。

Windows ランタイムは、Windows ランタイム API の一部である実用的な UI 要素ごとに既定の暗黙的なスタイルを定義します。 これらのスタイルは要素 (特にテンプレート) のビジュアルを定義し、ビジュアルのない要素が UI に表示されたり、レイアウトに参加したりしないため、これを行う必要があります。 これらの暗黙的なスタイルはすべて、generic.xaml という名前のデザイン ヘルパー XAML ファイルで確認できます。 XAML の編集に使用するツールは、ツールで有効になっているスタイルのコピーを編集するときに、アプリの XAML にこのファイルの個別の部分をコピーできます。 既定の暗黙的なスタイル内には、リソース参照のレイヤーが多数あり、 {ThemeResource} マークアップ拡張機能 とテーマ固有のブラシまたはその他のリソースを使用したテーマのサポートも多数あります。 それ以外の場合は、既定の暗黙的なスタイルを定義するWindows ランタイムから取得される暗黙的なスタイルをオーバーライドできます。 詳細については、 XAML スタイルXAML コントロール テンプレートに関するページを参照してください。

コードでの 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;
}

Tip

C# を使用してプログラミングする場合、 TypeName 型は System.Type としてプロジェクトされます。 C# を使用してプログラミングするときは、通常、 typeof 演算子を使用して、型名に基づく型の System.Type への参照を文字列として取得します。

移行のメモ

  • Windows Presentation Foundation (WPF) に XAML を使用している場合は、x:Type マークアップ拡張を使用して、System.Type を受け取る任意の XAML 値を入力している可能性があります。 Windows ランタイム XAML パーサーは x:Type をサポートしていません。 代わりに、マークアップ拡張を使用せずに名前で型を参照する必要があります。必要な XAML からバッキング型への変換は、XAML パーサーの組み込みの変換動作によって既に処理されています。

適用対象