ControlTemplate 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
指定可在控件多個實例之間共用之 Control 的視覺結構和行為層面。
public ref class ControlTemplate : System::Windows::FrameworkTemplate
[System.Windows.Localizability(System.Windows.LocalizationCategory.None, Readability=System.Windows.Readability.Unreadable)]
[System.Windows.Markup.DictionaryKeyProperty("TargetType")]
public class ControlTemplate : System.Windows.FrameworkTemplate
[<System.Windows.Localizability(System.Windows.LocalizationCategory.None, Readability=System.Windows.Readability.Unreadable)>]
[<System.Windows.Markup.DictionaryKeyProperty("TargetType")>]
type ControlTemplate = class
inherit FrameworkTemplate
Public Class ControlTemplate
Inherits FrameworkTemplate
- 繼承
- 屬性
範例
下列顯示設定 ButtonControlTemplate 的 ButtonStyle:
<Style TargetType="Button">
<!--Set to true to not get any properties from the themes.-->
<Setter Property="OverridesDefaultStyle" Value="True"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid>
<Ellipse Fill="{TemplateBinding Background}"/>
<ContentPresenter HorizontalAlignment="Center"
VerticalAlignment="Center"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
當您將 Control 的 Template 屬性設定為新的 ControlTemplate,如上述範例所示,您要取代整個範本。 當 Button 處於焦點或按下狀態時,其外觀就像是您正在取代之按鈕的默認外觀的一部分。 因此,視您的需求而定,您可能會想要在按下按鈕時放入您的定義中,依這類方式放入您的定義中,如下列範例所示:
<Style TargetType="Button">
<Setter Property="SnapsToDevicePixels"
Value="true" />
<Setter Property="OverridesDefaultStyle"
Value="true" />
<Setter Property="FocusVisualStyle"
Value="{StaticResource ButtonFocusVisual}" />
<Setter Property="MinHeight"
Value="23" />
<Setter Property="MinWidth"
Value="75" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border TextBlock.Foreground="{TemplateBinding Foreground}"
x:Name="Border"
CornerRadius="2"
BorderThickness="1">
<Border.BorderBrush>
<LinearGradientBrush StartPoint="0,0"
EndPoint="0,1">
<LinearGradientBrush.GradientStops>
<GradientStopCollection>
<GradientStop Color="{DynamicResource BorderLightColor}"
Offset="0.0" />
<GradientStop Color="{DynamicResource BorderDarkColor}"
Offset="1.0" />
</GradientStopCollection>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Border.BorderBrush>
<Border.Background>
<LinearGradientBrush EndPoint="0.5,1"
StartPoint="0.5,0">
<GradientStop Color="{DynamicResource ControlLightColor}"
Offset="0" />
<GradientStop Color="{DynamicResource ControlMediumColor}"
Offset="1" />
</LinearGradientBrush>
</Border.Background>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualStateGroup.Transitions>
<VisualTransition GeneratedDuration="0:0:0.5" />
<VisualTransition GeneratedDuration="0"
To="Pressed" />
</VisualStateGroup.Transitions>
<VisualState x:Name="Normal" />
<VisualState x:Name="MouseOver">
<Storyboard>
<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).
(GradientBrush.GradientStops)[1].(GradientStop.Color)"
Storyboard.TargetName="Border">
<EasingColorKeyFrame KeyTime="0"
Value="{StaticResource ControlMouseOverColor}" />
</ColorAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="Pressed">
<Storyboard>
<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).
(GradientBrush.GradientStops)[1].(GradientStop.Color)"
Storyboard.TargetName="Border">
<EasingColorKeyFrame KeyTime="0"
Value="{StaticResource ControlPressedColor}" />
</ColorAnimationUsingKeyFrames>
<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush).
(GradientBrush.GradientStops)[0].(GradientStop.Color)"
Storyboard.TargetName="Border">
<EasingColorKeyFrame KeyTime="0"
Value="{StaticResource PressedBorderDarkColor}" />
</ColorAnimationUsingKeyFrames>
<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush).
(GradientBrush.GradientStops)[1].(GradientStop.Color)"
Storyboard.TargetName="Border">
<EasingColorKeyFrame KeyTime="0"
Value="{StaticResource PressedBorderLightColor}" />
</ColorAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="Disabled">
<Storyboard>
<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).
(GradientBrush.GradientStops)[1].(GradientStop.Color)"
Storyboard.TargetName="Border">
<EasingColorKeyFrame KeyTime="0"
Value="{StaticResource DisabledControlDarkColor}" />
</ColorAnimationUsingKeyFrames>
<ColorAnimationUsingKeyFrames
Storyboard.TargetProperty="(TextBlock.Foreground).(SolidColorBrush.Color)"
Storyboard.TargetName="Border">
<EasingColorKeyFrame KeyTime="0"
Value="{StaticResource DisabledForegroundColor}" />
</ColorAnimationUsingKeyFrames>
<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush).
(GradientBrush.GradientStops)[1].(GradientStop.Color)"
Storyboard.TargetName="Border">
<EasingColorKeyFrame KeyTime="0"
Value="{StaticResource DisabledBorderDarkColor}" />
</ColorAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<ContentPresenter Margin="2"
HorizontalAlignment="Center"
VerticalAlignment="Center"
RecognizesAccessKey="True" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsDefault"
Value="true">
<Setter TargetName="Border"
Property="BorderBrush">
<Setter.Value>
<LinearGradientBrush StartPoint="0,0"
EndPoint="0,1">
<GradientBrush.GradientStops>
<GradientStopCollection>
<GradientStop Color="{DynamicResource DefaultBorderBrushLightBrush}"
Offset="0.0" />
<GradientStop Color="{DynamicResource DefaultBorderBrushDarkColor}"
Offset="1.0" />
</GradientStopCollection>
</GradientBrush.GradientStops>
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
請注意,此範例會參考此處未顯示的資源。 如需完整的範例,請參閱使用 ControlTemplates 範例 樣式。 該範例提供許多控件的控件範例,是開始建立控件範本的最佳方式。
備註
ControlTemplate 可讓您指定控件的視覺結構。 控件作者可以定義預設 ControlTemplate,而應用程式作者可以覆寫 ControlTemplate,以重新建構控件的視覺結構。
控件範本化是 WPF 樣式和範本化模型所提供的許多功能之一。 樣式和範本化模型提供如此巨大的彈性,在許多情況下,您不需要撰寫自己的控件。 如果您是想要變更控件視覺效果或取代現有控件 ControlTemplate 的應用程式作者,請參閱 樣式和範本化 主題,以取得範例和深入討論。
如果您要撰寫自己的控制項,請參閱 控制項撰寫概觀中的。
ControlTemplate 是實作詳細數據的自封單位,對外部用戶和物件看不見,包括樣式。 操作控件範本內容的唯一方式是來自相同控件範本內。
XAML 屬性元素使用方式
<ControlTemplate>
<VisualTreeRootNode>
VisualTreeNodeContents
</VisualTreeRootNode>
</ControlTemplate>
XAML 值
ControlTemplate 或衍生類別的ControlTemplate Object 元素。
VisualTreeRootNode 單一 XAML 元素作為 ControlTemplate 的直接子系(或衍生類別)。 範本必須有單一根節點。 為了產生有用的範本,選擇為 VisualTreeRootNode 的項目應該支援自己的內容模型,通常是支援多個子元素的模型。
VisualTreeNodeContents 完成預定範本的一或多個元素。 如果選擇為 VisualTreeRootNode 的元素 只支援單一子系,則只能有一個元素宣告為 VisualTreeNodeContents。 如果選擇的 VisualTreeRootNode 支援文字內容屬性,也可能提供文字內容。
建構函式
ControlTemplate() |
初始化 ControlTemplate 類別的新實例。 |
ControlTemplate(Type) |
使用指定的目標型別,初始化 ControlTemplate 類別的新實例。 |
屬性
Dispatcher |
取得與這個 DispatcherObject 相關聯的 Dispatcher。 (繼承來源 DispatcherObject) |
HasContent |
取得值,這個值表示這個範本是否有優化的內容。 (繼承來源 FrameworkTemplate) |
IsSealed |
取得值,這個值表示這個物件是否處於不可變狀態,因此無法變更。 (繼承來源 FrameworkTemplate) |
Resources |
取得或設定可在此範本範圍內使用的資源集合。 (繼承來源 FrameworkTemplate) |
TargetType |
取得或設定這個 ControlTemplate 預定的類型。 |
Template |
取得或設定對象的參考,這個物件會在寫入器定義或套用範本時記錄或播放範本的 XAML 節點。 (繼承來源 FrameworkTemplate) |
Triggers |
取得套用屬性變更或根據指定條件執行動作之 TriggerBase 物件的集合。 |
VisualTree |
取得或設定範本的根節點。 (繼承來源 FrameworkTemplate) |
方法
CheckAccess() |
判斷呼叫端線程是否可存取此 DispatcherObject。 (繼承來源 DispatcherObject) |
Equals(Object) |
判斷指定的物件是否等於目前的物件。 (繼承來源 Object) |
FindName(String, FrameworkElement) |
尋找與此範本內定義之指定名稱相關聯的專案。 (繼承來源 FrameworkTemplate) |
GetHashCode() |
做為預設哈希函式。 (繼承來源 Object) |
GetType() |
取得目前實例的 Type。 (繼承來源 Object) |
LoadContent() |
載入範本的內容做為 對象的實例,並傳回內容的根元素。 (繼承來源 FrameworkTemplate) |
MemberwiseClone() |
建立目前 Object的淺層複本。 (繼承來源 Object) |
RegisterName(String, Object) |
將新的名稱/物件組註冊到目前的名稱範圍。 (繼承來源 FrameworkTemplate) |
Seal() |
鎖定範本,使其無法變更。 (繼承來源 FrameworkTemplate) |
ShouldSerializeResources(XamlDesignerSerializationManager) |
傳回值,這個值表示串行化進程是否應該在這個類別的實例上串行化 Resources 屬性值。 (繼承來源 FrameworkTemplate) |
ShouldSerializeVisualTree() |
傳回值,這個值表示串行化進程是否應該在這個類別的實例上串行化 VisualTree 屬性值。 (繼承來源 FrameworkTemplate) |
ToString() |
傳回表示目前 物件的字串。 (繼承來源 Object) |
UnregisterName(String) |
從 XAML 命名範圍移除名稱/對象對應。 (繼承來源 FrameworkTemplate) |
ValidateTemplatedParent(FrameworkElement) |
根據一組規則檢查樣板化父系。 |
VerifyAccess() |
強制呼叫線程可以存取此 DispatcherObject。 (繼承來源 DispatcherObject) |
明確介面實作
INameScope.FindName(String) |
傳回具有所提供識別名稱的物件。 (繼承來源 FrameworkTemplate) |
IQueryAmbient.IsAmbientPropertyAvailable(String) |
查詢目前範圍中是否提供指定的環境屬性。 (繼承來源 FrameworkTemplate) |