共用方式為


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必須只有一個根項目做為其內容。

範例

此範例示範定義為Style和 Setter 的更完整控制項範本,其Setter.Property值為 「Template」。 這是 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> 

備註

上面顯示的第二個 XAML 語法是 Setter 語法作為 Style的一部分。 這是 控制項 的範本值在幾乎所有情況下定義的方式。

TargetType 是做為範本值之所有 ControlTemplate 元素的必要屬性。 如果您使用 style-setter 語法,此值應該符合包含Template Setter 之StyleTargetType屬性。

ControlTemplate會指定Control的外觀;如果 Control 沒有ControlTemplate控制項將不會顯示于您的應用程式中。 控制項作者會定義預設控制項範本,而應用程式作者可以重新建立 ControlTemplate XAML 範本,以重新定義控制項的視覺化樹狀結構。

控制項 範本通常會在可延伸的應用程式標記語言 (XAML) 中設定為控制項特定隱含樣式的一部分。 在此情況下,Setter中的屬性值會設定為字串 「Template」,而Setter.Value值會設定為屬性元素,其中包含ControlTemplate物件專案。 例如,這是定義ScrollViewer範本值的Style。 這是隱含樣式的範例,其中 Style 可以位於 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>

樣式及範本

您可以使用Style中的Setter,將值套用至任何相依性屬性。 但它是Control衍生類別之 Template 屬性的Setter,其構成一般Style中大部分的 XAML 標記。 使用Style來定義控制項範本時,Style元素的TargetType及其Control.Template setter 的 ControlTemplate元素TargetType應該一律使用相同的值。 Template setter 會定義套用該範本之控制項的基本樣板化 UI 定義。 它也包含控制項的視覺狀態,以及其他以狀態為基礎的 UI 定義,例如預設主題轉換。 對於 ListBox之類的複雜控制項,內的預設範本 StyleControlTemplate 可以有數百行 XAML。 如需控制項範本化案例中範本角色的詳細資訊,請參閱 快速入門:控制項範本

隱含樣式

您可以定義樣式,讓相同TargetType的所有物件隱含使用Style,而不需要這類物件的每個實例將 Style 特別參考為FrameworkElement.Style值。 <Style>在沒有x:Key 屬性ResourceDictionary中宣告資源時,x:Key值會使用TargetType屬性的值。 如果您隱含設定樣式,樣式只會套用至完全符合 TargetType 的類型,而不是套用至衍生自 TargetType 值的元素。 例如,如果您隱含建立應用程式中所有ToggleButton控制項的樣式,而且您的應用程式具有ToggleButtonCheckBox 控制項, (CheckBox衍生自ToggleButton) ,則 「ToggleButton」 隱含樣式只會套用至ToggleButton控制項。

適用於

另請參閱