Language

Control.Template プロパティ

定義

コントロール テンプレートを取得または設定します。 コントロール テンプレートは、UI でコントロールの外観を定義し、XAML マークアップで定義します。

public:
 property ControlTemplate ^ Template { ControlTemplate ^ get(); void set(ControlTemplate ^ value); };
ControlTemplate Template();

void Template(ControlTemplate value);
public ControlTemplate Template { get; set; }
var controlTemplate = control.template;
control.template = controlTemplate;
Public Property Template As ControlTemplate
<control Template="{StaticResource templateResourceKey}"/>
- or -
<Style TargetType="controlTypeName">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="controlTypeName">
        templateRoot
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

プロパティ値

コントロールの外観を定義するテンプレート。 ControlTemplate には、コンテンツとしてルート要素が 1 つだけ必要です。

例

この例では、Setter.Property 値が "Template" の Style および Setter として定義された、より完全なコントロール テンプレートを示します。 これは RadioButton コントロールの名前付きスタイルです。 これには、通常、機能コントロール テンプレートの一部であるテンプレート要素 (テンプレートのルート要素にアタッチされた VisualStateManager.VisualStateGroups 添付プロパティ要素、各目立つコントロール パーツに割り当てられた x:Name 属性値 など) が含まれます。

<Style x:Key="TextRadioButtonStyle" TargetType="RadioButton"> 
    <Setter Property="MinWidth" Value="0"/> 
    <Setter Property="MinHeight" Value="0"/> 
    <Setter Property="Template"> 
        <Setter.Value> 
            <ControlTemplate TargetType="RadioButton"> 
                <Grid Background="Transparent"> 
                    <TextBlock 
                        x:Name="Text" 
                        Text="{TemplateBinding Content}" 
                        Margin="3,-7,3,10" 
                        TextWrapping="NoWrap" 
                        Style="{StaticResource SubheaderTextStyle}"/> 
                    <Rectangle 
                        x:Name="FocusVisualWhite" 
                        IsHitTestVisible="False" 
                        Stroke="{StaticResource FocusVisualWhiteStrokeThemeBrush}" 
                        StrokeEndLineCap="Square" 
                        StrokeDashArray="1,1" 
                        Opacity="0" 
                        StrokeDashOffset="1.5"/> 
                    <Rectangle 
                        x:Name="FocusVisualBlack" 
                        IsHitTestVisible="False" 
                        Stroke="{StaticResource FocusVisualBlackStrokeThemeBrush}" 
                        StrokeEndLineCap="Square" 
                        StrokeDashArray="1,1" 
                        Opacity="0" 
                        StrokeDashOffset="0.5"/> 

                    <VisualStateManager.VisualStateGroups> 
                        <VisualStateGroup x:Name="CommonStates"> 
                            <VisualState x:Name="Normal"/> 
                            <VisualState x:Name="PointerOver"> 
                                <Storyboard> 
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Text" Storyboard.TargetProperty="Foreground"> 
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ApplicationPointerOverForegroundThemeBrush}"/> 
                                    </ObjectAnimationUsingKeyFrames> 
                                </Storyboard> 
                            </VisualState> 
                            <VisualState x:Name="Pressed"> 

                                <Storyboard> 
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Text" Storyboard.TargetProperty="Foreground"> 
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ApplicationPressedForegroundThemeBrush}"/> 
                                    </ObjectAnimationUsingKeyFrames> 
                                </Storyboard> 
                            </VisualState> 
                            <VisualState x:Name="Disabled"> 
                                <Storyboard> 
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Text" Storyboard.TargetProperty="Foreground"> 
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ButtonDisabledForegroundThemeBrush}"/> 
                                    </ObjectAnimationUsingKeyFrames> 
                                </Storyboard> 
                            </VisualState> 
                        </VisualStateGroup> 
                        <VisualStateGroup x:Name="FocusStates"> 
                            <VisualState x:Name="Focused"> 
                                <Storyboard> 
                                    <DoubleAnimation Duration="0" To="1" Storyboard.TargetName="FocusVisualWhite" Storyboard.TargetProperty="Opacity"/> 
                                    <DoubleAnimation Duration="0" To="1" Storyboard.TargetName="FocusVisualBlack" Storyboard.TargetProperty="Opacity"/> 
                                </Storyboard> 
                            </VisualState> 
                            <VisualState x:Name="Unfocused"/> 
                        </VisualStateGroup> 
                        <VisualStateGroup x:Name="CheckStates"> 
                            <VisualState x:Name="Checked"/> 
                            <VisualState x:Name="Unchecked"> 
                                <Storyboard> 
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Text" Storyboard.TargetProperty="Foreground"> 
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ApplicationSecondaryForegroundThemeBrush}"/> 
                                    </ObjectAnimationUsingKeyFrames> 
                                </Storyboard> 
                            </VisualState> 
                            <VisualState x:Name="Indeterminate"/> 
                        </VisualStateGroup> 
                    </VisualStateManager.VisualStateGroups> 
                </Grid> 
            </ControlTemplate> 
        </Setter.Value> 
    </Setter> 
</Style> 

注釈

上記の 2 番目の XAML 構文は、スタイルの一部としての Setter 構文です。 これは、ほぼすべてのケースで コントロール の Template 値を定義する方法です。

TargetType は、テンプレート値として使用されるすべての ControlTemplate 要素に必要な属性です。 スタイル セッター構文を使用している場合、この値はテンプレートの Setter を含む Style の TargetType プロパティと一致する必要があります。

ControlTemplate は、コントロールの外観を指定します。コントロールに ControlTemplate がない場合、コントロールはアプリに表示されません。 コントロール作成者は既定のコントロール テンプレートを定義し、アプリの作成者は ControlTemplate XAML を再テンプレート化してコントロールのビジュアル ツリーを再定義できます。

コントロール テンプレートは、通常、コントロール固有の暗黙的なスタイルの一部として、拡張アプリケーション マークアップ言語 (XAML) で設定されます。 この場合、Setter の Property 値は文字列 "Template" として設定され、Setter.Value 値は、ControlTemplate オブジェクト要素を含むプロパティ要素として設定されます。 たとえば、ScrollViewer のテンプレート値を定義するスタイルです。 これは暗黙的なスタイルの例です。 スタイル は ResourceDictionary に含めることができますが、 x:Key 属性は必要ありません。

<ResourceDictionary>
  <Style TargetType="ScrollViewer">
  ...
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="ScrollViewer">
          <!--visual root of template for a ScrollViewer-->
        </ControlTemplate>
      </Setter.Value>
    </Setter>
  </Style>
  ...
</ResourceDictionary>

スタイルとテンプレート

スタイルの Setter を使用して、任意の依存関係プロパティに値を適用できます。 ただし、一般的なスタイルの XAML マークアップの大部分を構成するのは、コントロール派生クラスの Template プロパティの Setter です。 Style を使用してコントロール テンプレートを定義する場合、その Control.Template セッターの Style 要素の TargetType と ControlTemplate 要素の TargetType は常に同じ値を使用する必要があります。 テンプレート セッターは、そのテンプレートが適用されるコントロールの基本的なテンプレート化された UI 定義を定義します。 また、コントロールの表示状態や、既定のテーマ切り替えなどの状態ベースの UI 定義も含まれます。 ListBox などの複雑なコントロールの場合、既定のテンプレート Style と ControlTemplate 内には数百行の XAML を含めることができます。 コントロール テンプレートのシナリオにおけるテンプレートの役割の詳細については、「 XAML コントロール テンプレート」を参照してください。

暗黙的なスタイル

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

適用対象

こちらもご覧ください