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