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
- 继承
- 属性
示例
下面显示了设置 ButtonStyleControlTemplate 的 的 。Button
<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 现有控件的 ,请参阅 样式设置和模板化 主题以获取示例和深入讨论。
如果要编写自己的控件,请参阅控件创作概述中的“Create自定义控件”。
ControlTemplate旨在成为对外部用户和对象(包括样式)不可见的实现详细信息的自包含单元。 操作控件模板内容的唯一方法是在同一控件模板中操作。
XAML 属性元素用法
<ControlTemplate>
<VisualTreeRootNode>
VisualTreeNodeContents
</VisualTreeRootNode>
</ControlTemplate>
XAML 值
ControlTemplate 或 ControlTemplate 派生类的对象元素。
VisualTreeRootNode 作为 (的直接子级的 ControlTemplate 单个 XAML 元素或派生类) 。 模板必须具有单个根节点。 为了生成有用的模板,选择为 VisualTreeRootNode 的元素应支持自己的内容模型,通常是支持多个子元素的模型。
VisualTreeNodeContents 完成预期模板的一个或多个元素。 如果选为 VisualTreeRootNode 的元素仅支持单个子元素,则只能有一个元素声明为 VisualTreeNodeContents。 如果所选 VisualTreeRootNode 支持文本内容属性, (但不常见) 提供文本内容。
构造函数
ControlTemplate() |
初始化 ControlTemplate 类的新实例。 |
ControlTemplate(Type) |
使用指定的目标类型初始化 ControlTemplate 类的新实例。 |
属性
Dispatcher |
获取与此 Dispatcher 关联的 DispatcherObject。 (继承自 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) |
适用于
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈