Control.Template 屬性
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
取得或設定控制項範本。 控制項範本會定義 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 之Style的TargetType屬性。
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之類的複雜控制項,內的預設範本 Style 和 ControlTemplate 可以有數百行 XAML。 如需控制項範本化案例中範本角色的詳細資訊,請參閱 快速入門:控制項範本。
隱含樣式
您可以定義樣式,讓相同TargetType的所有物件隱含使用Style,而不需要這類物件的每個實例將 Style 特別參考為FrameworkElement.Style值。
<Style>
在沒有x:Key 屬性的ResourceDictionary中宣告資源時,x:Key值會使用TargetType屬性的值。 如果您隱含設定樣式,樣式只會套用至完全符合 TargetType 的類型,而不是套用至衍生自 TargetType 值的元素。 例如,如果您隱含建立應用程式中所有ToggleButton控制項的樣式,而且您的應用程式具有ToggleButton和CheckBox 控制項, (CheckBox衍生自ToggleButton) ,則 「ToggleButton」 隱含樣式只會套用至ToggleButton控制項。