語言

Control.Template 屬性

定義

取得或設定控制範本。 控制範本定義了使用者介面中控制項的視覺外觀,並以 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 語法是作為 Style 一部分的 Setter 語法。 這幾乎是所有情況下,控制 項 的模板值定義方式。

TargetType 是所有 ControlTemplate 元素中作為範本值的必備屬性。 如果你使用樣式設定器語法,該值應該會與包含 Setter for Template 的 Style(TargetType)屬性相符。

ControlTemplate 指定控制項的外觀;如果一個控制項沒有控制範本,該控制項在你的應用程式中將不會有可見的存在。 控制項作者定義預設控制範本,應用程式作者則可重新範本 ControlTemplate XAML 以重新定義控制項的視覺樹狀結構。

控制 範本通常以可擴充應用標記語言(XAML)作為控制項專用隱式樣式的一部分設置。 此時,Setter 中的 Property 值被設定為字串「Template」,而 Setter.Value 值則設為屬性元素,其中包含 ControlTemplate 物件元素。 例如,這是定義 RollViewer 模板值的樣式。 這是一個隱式樣式的例子, 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 來套用任何相依屬性的值。 但在典型 Style 中,XAML 標記的主要是 Control 衍生類別的 Template 屬性設定器。 當使用 Style 來定義控制範本時,Style 元素的 TargetType 與 ControlTemplate 元素的 TargetType 對應使用相同的值。 模板設定器定義了套用該範本的控制項的基本模板化使用者介面定義。 它也包含控制項的視覺狀態,以及其他基於狀態的 UI 定義,例如預設主題轉換。 對於像 ListBox 這樣複雜的控制項,預設範本 Style 和其中的 ControlTemplate 可以包含數百行 XAML。 欲了解更多關於模板在控制模板情境中的角色,請參見 XAML 控制範本。

隱含風格

你可以定義風格,使得同一 TargetType 的所有物件隱含使用該風格,而不必要求每個物件實例都特別以 FrameworkElement.Style 值來引用該風格。 當 <Style> 資源在 ResourceDictionary 中宣告但沒有 x:Key 屬性時, x:Key 值會使用 TargetType 屬性的值。 如果你隱含設定樣式,樣式只會套用在與 TargetType 完全匹配的類型上,而不會套用在從 TargetType 值衍生的元素上。 例如,如果你隱含為應用程式中所有 ToggleButton 控制項建立樣式,且應用程式有 ToggleButton 和 CheckBox 控制(CheckBox 源自 ToggleButton),那麼「ToggleButton」隱含樣式只會套用在 ToggleButton 控制項上。

適用於

另請參閱