共用方式為


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。 如需控件範本化案例中範本角色的詳細資訊,請參閱 XAML 控件範本

隱含樣式

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

適用於

另請參閱