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
继承
属性

示例

下面显示了一个ButtonStyle设置 ControlTemplateButton

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

应用此项后,将显示 ButtonEllipse

按钮 ControlTemplate 示例

将 a Control 属性设置为TemplateControlTemplate上述示例中的新属性时,将替换整个模板。 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 现有控件的应用程序作者,请参阅 样式和模板 化主题,获取示例和深入讨论。

如果要编写自己的控件,请参阅 控件创作概述中的“创建自定义控件”。

A ControlTemplate 旨在作为实现详细信息的自包含单元,对外部用户和对象(包括样式)不可见。 操作控件模板内容的唯一方法是在同一控件模板中。

XAML 属性元素用法

<ControlTemplate>  
  <VisualTreeRootNode>
    VisualTreeNodeContents  
  </VisualTreeRootNode>  
</ControlTemplate>  

XAML 值

ControlTemplate
对象元素或 ControlTemplate 派生类。

VisualTreeRootNode
单个 XAML 元素作为 (的直接子元素 ControlTemplate 或派生类) 。 模板必须具有单个根节点。 为了生成有用的模板,选择为 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)

适用于

另请参阅