要查看英语原文,请勾选“英语”复选框。也可将鼠标指针移到文本上,在弹出窗口中显示英语原文。
翻译
英语
本文档已存档,并且将不进行维护。

ControlTemplate 类

指定 Control 的可在其多个实例之间共享的可视结构和行为方面。

命名空间:  System.Windows.Controls
程序集:  PresentationFramework(在 PresentationFramework.dll 中)
用于 XAML 的 XMLNS:http://schemas.microsoft.com/winfx/2006/xaml/presentation, http://schemas.microsoft.com/netfx/2007/xaml/presentation

[DictionaryKeyPropertyAttribute("TargetType")]
[LocalizabilityAttribute(LocalizationCategory.None, Readability = Readability.Unreadable)]
public class ControlTemplate : FrameworkTemplate
<ControlTemplate>
  <VisualTreeRootNode>
VisualTreeNodeContents
  </VisualTreeRootNode>
</ControlTemplate>

XAML 值

ControlTemplate

ControlTemplate 或派生类的对象元素。

VisualTreeRootNode

作为 ControlTemplate(或派生类)直接子级的一个 XAML 元素。 模板必须具有一个根节点。 为了生成有用的模板,选定作为 VisualTreeRootNode 的元素应支持它自己的内容模型,通常为支持多个子元素的模型。

VisualTreeNodeContents

完成预期模板的一个或多个元素。 如果选定作为 VisualTreeRootNode 的元素仅支持一个子级,则只能有一个元素声明为 VisualTreeNodeContents 如果所选 VisualTreeRootNode 支持文本内容属性,则它还可能(虽然并不常见)会提供文本内容。

ControlTemplate 类型公开以下成员。

  名称说明
公共方法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 是否等于当前的 Object (继承自 Object。)
受保护的方法Finalize允许对象在“垃圾回收”回收之前尝试释放资源并执行其他清理操作。 (继承自 Object。)
公共方法FindName查找与在此模板中定义的指定名称相关联的元素。 (继承自 FrameworkTemplate。)
公共方法GetHashCode用作特定类型的哈希函数。 (继承自 Object。)
公共方法GetType获取当前实例的 Type (继承自 Object。)
公共方法LoadContent将模板的内容加载为对象的实例,并返回该内容的根元素。 (继承自 FrameworkTemplate。)
受保护的方法MemberwiseClone创建当前 Object 的浅表副本。 (继承自 Object。)
公共方法RegisterName将新的名称/对象对注册到当前名称范围内。 (继承自 FrameworkTemplate。)
公共方法Seal锁定模板,使其无法更改。 (继承自 FrameworkTemplate。)
公共方法ShouldSerializeResources返回一个值,该值指示序列化过程是否应序列化此类的实例上的 Resources 属性值。 (继承自 FrameworkTemplate。)
公共方法ShouldSerializeVisualTree返回一个值,该值指示序列化过程是否应序列化此类的实例上的 VisualTree 属性值。 (继承自 FrameworkTemplate。)
公共方法ToString返回表示当前对象的字符串。 (继承自 Object。)
公共方法UnregisterName从 XAML 名称范围中移除名称/对象映射。 (继承自 FrameworkTemplate。)
受保护的方法ValidateTemplatedParent根据一组规则检查模板化父级。 (重写 FrameworkTemplate.ValidateTemplatedParent(FrameworkElement)。)
公共方法VerifyAccess强制调用线程具有此 DispatcherObject 的访问权限。 (继承自 DispatcherObject。)
页首

  名称说明
显式接口实现私有方法INameScope.FindName基础结构。返回一个具有提供的标识名称的对象。 (继承自 FrameworkTemplate。)
显式接口实现私有方法IQueryAmbient.IsAmbientPropertyAvailable查询当前范围中是否有指定的环境属性。 (继承自 FrameworkTemplate。)
页首

ControlTemplate 允许您指定控件的可视结构。 控件作者可以定义默认的 ControlTemplate,而应用程序作者可以重写 ControlTemplate 以重新构建控件的可视结构。

控件模板化是 WPF 样式和模板化模型提供的众多功能中的一种。 样式和模板化模型为您提供了很大的灵活性,在许多情况下,您都不需要编写自己的控件。 如果您是希望更改控件的可视化或替换现有控件的 ControlTemplate 的应用程序作者,请参见 样式设置和模板化 主题来获取示例和深入讨论。

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

ControlTemplate 旨在用作实现详细信息的独立单元,对于外部用户和对象(包括样式)不可见。 仅可以从同一控件模板的内部操作此控件模板的内容。

下面显示了一个 ButtonStyle,它用于设置 ButtonControlTemplate


<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

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


请注意,此示例引用了此处未显示的资源。 有关完整示例,请参见 Styling with ControlTemplates Sample(使用 ControlTemplates 设置样式的示例)。 该示例提供了众多控件的控件模板示例,是创建控件模板的最佳入门方法。

.NET Framework

受以下版本支持:4、3.5、3.0

.NET Framework Client Profile

受以下版本支持:4、3.5 SP1

Windows 7, Windows Vista SP1 或更高版本, Windows XP SP3, Windows Server 2008(不支持服务器核心), Windows Server 2008 R2(支持 SP1 或更高版本的服务器核心), Windows Server 2003 SP2

.NET Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求

此类型的任何公共 static(在 Visual Basic 中为 Shared) 成员都是线程安全的。但不保证所有实例成员都是线程安全的。
显示: