ControlTemplate 类

定义

指定可在控件的多个实例之间共享的 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
继承
属性

示例

下面显示了设置 ButtonControlTemplateButtonStyle

<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>

应用后,Button 显示为 Ellipse

Button ControlTemplate 示例

ControlTemplate 属性设置为上述示例中的新 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 object 元素用于 ControlTemplate 或派生类。

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)

适用于

另请参阅