Control.Template 属性

定义

获取或设置控件模板。 控件模板定义 UI 中控件的视觉外观,并在 XAML 标记中定义。

适用于 UWP 的等效 WinUI 2 API:Windows 应用 SDK中 WinUI 的 Microsoft.UI.Xaml.Controls.Control.Template (,请参阅) Windows 应用 SDK命名空间

public:
 property ControlTemplate ^ Template { ControlTemplate ^ get(); void set(ControlTemplate ^ value); };
ControlTemplate Template();

void Template(ControlTemplate value);
public ControlTemplate Template { get; set; }
var controlTemplate = control.template;
control.template = controlTemplate;
Public Property Template As ControlTemplate
<control Template="{StaticResource templateResourceKey}"/>
- or -
<Style TargetType="controlTypeName">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="controlTypeName">
        templateRoot
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

属性值

ControlTemplate

定义 Control 外观的模板。 ControlTemplate必须只有一个根元素作为其内容。

示例

此示例演示了一个更完整的控件模板,该模板定义为 Style Setter Setter.Property “Template”的值。 这是控件的 RadioButton 命名样式。 它包括通常属于功能控件模板的模板元素,例如附加到模板根元素的 VisualStateManager.VisualStateGroups 附加属性元素,以及分配给每个突出控件部件的 x:Name 属性值

<Style x:Key="TextRadioButtonStyle" TargetType="RadioButton"> 
    <Setter Property="MinWidth" Value="0"/> 
    <Setter Property="MinHeight" Value="0"/> 
    <Setter Property="Template"> 
        <Setter.Value> 
            <ControlTemplate TargetType="RadioButton"> 
                <Grid Background="Transparent"> 
                    <TextBlock 
                        x:Name="Text" 
                        Text="{TemplateBinding Content}" 
                        Margin="3,-7,3,10" 
                        TextWrapping="NoWrap" 
                        Style="{StaticResource SubheaderTextStyle}"/> 
                    <Rectangle 
                        x:Name="FocusVisualWhite" 
                        IsHitTestVisible="False" 
                        Stroke="{StaticResource FocusVisualWhiteStrokeThemeBrush}" 
                        StrokeEndLineCap="Square" 
                        StrokeDashArray="1,1" 
                        Opacity="0" 
                        StrokeDashOffset="1.5"/> 
                    <Rectangle 
                        x:Name="FocusVisualBlack" 
                        IsHitTestVisible="False" 
                        Stroke="{StaticResource FocusVisualBlackStrokeThemeBrush}" 
                        StrokeEndLineCap="Square" 
                        StrokeDashArray="1,1" 
                        Opacity="0" 
                        StrokeDashOffset="0.5"/> 

                    <VisualStateManager.VisualStateGroups> 
                        <VisualStateGroup x:Name="CommonStates"> 
                            <VisualState x:Name="Normal"/> 
                            <VisualState x:Name="PointerOver"> 
                                <Storyboard> 
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Text" Storyboard.TargetProperty="Foreground"> 
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ApplicationPointerOverForegroundThemeBrush}"/> 
                                    </ObjectAnimationUsingKeyFrames> 
                                </Storyboard> 
                            </VisualState> 
                            <VisualState x:Name="Pressed"> 

                                <Storyboard> 
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Text" Storyboard.TargetProperty="Foreground"> 
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ApplicationPressedForegroundThemeBrush}"/> 
                                    </ObjectAnimationUsingKeyFrames> 
                                </Storyboard> 
                            </VisualState> 
                            <VisualState x:Name="Disabled"> 
                                <Storyboard> 
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Text" Storyboard.TargetProperty="Foreground"> 
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ButtonDisabledForegroundThemeBrush}"/> 
                                    </ObjectAnimationUsingKeyFrames> 
                                </Storyboard> 
                            </VisualState> 
                        </VisualStateGroup> 
                        <VisualStateGroup x:Name="FocusStates"> 
                            <VisualState x:Name="Focused"> 
                                <Storyboard> 
                                    <DoubleAnimation Duration="0" To="1" Storyboard.TargetName="FocusVisualWhite" Storyboard.TargetProperty="Opacity"/> 
                                    <DoubleAnimation Duration="0" To="1" Storyboard.TargetName="FocusVisualBlack" Storyboard.TargetProperty="Opacity"/> 
                                </Storyboard> 
                            </VisualState> 
                            <VisualState x:Name="Unfocused"/> 
                        </VisualStateGroup> 
                        <VisualStateGroup x:Name="CheckStates"> 
                            <VisualState x:Name="Checked"/> 
                            <VisualState x:Name="Unchecked"> 
                                <Storyboard> 
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Text" Storyboard.TargetProperty="Foreground"> 
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ApplicationSecondaryForegroundThemeBrush}"/> 
                                    </ObjectAnimationUsingKeyFrames> 
                                </Storyboard> 
                            </VisualState> 
                            <VisualState x:Name="Indeterminate"/> 
                        </VisualStateGroup> 
                    </VisualStateManager.VisualStateGroups> 
                </Grid> 
            </ControlTemplate> 
        </Setter.Value> 
    </Setter> 
</Style> 

注解

上面所示的第二个 XAML 语法是作为 Setter 语法的一 Style部分。 这就是几乎所有情况下定义模板值 Control 的方式。

TargetType 是用作模板值的所有 ControlTemplate 元素的必需属性。 如果使用 style-setter 语法,该值应与包含 Setter for Template 的属性Style匹配TargetType

指定ControlTemplate一个Control外观;如果不存在ControlControlTemplate,则Control应用中没有可见状态。 控件作者定义默认控件模板,应用作者可以重新模板 ControlTemplate XAML 以重新定义控件的可视化树。

Control 模板通常设置为可扩展应用程序标记语言 (XAML) 作为特定于控件的隐式样式的一部分。 在本例中, PropertySetter 设置为字符串“Template”,该值 Setter.Value 设置为包含对象元素的属性元素 ControlTemplate 。 例如,这是 Style 定义模板值的模板值 ScrollViewer。 这是隐式样式的一个示例,其中 Style 可以是 ResourceDictionary x :Key 属性,但不需要 x:Key 属性

<ResourceDictionary>
  <Style TargetType="ScrollViewer">
  ...
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="ScrollViewer">
          <!--visual root of template for a ScrollViewer-->
        </ControlTemplate>
      </Setter.Value>
    </Setter>
  </Style>
  ...
</ResourceDictionary>

样式和模板

可以使用 in Style a Setter 将值应用于任何依赖项属性。 但是,它是 Setter 一个 Control派生类的 Template 属性,该属性构成典型 Style中的大多数 XAML 标记。 当用于Style定义控件模板时,TargetTypeStyle元素及其 TargetType Control.Template setter 的ControlTemplate元素应始终使用相同的值。 Template setter 定义应用该模板的控件的基本模板化 UI 定义。 它还包含控件的视觉状态和其他基于状态的 UI 定义,例如默认主题切换。 对于复杂控件,例如 ListBox,默认模板 StyleControlTemplate 内部可以有数百行 XAML。 有关模板在控制模板化方案中的角色的详细信息,请参阅 快速入门:控制模板

隐式样式

可以定义样式, Style 以便由同 TargetType一对象的所有对象隐式使用,而无需此类对象的每个实例专门引用 Style 作为值 FrameworkElement.Style<Style>在没有 x:Key 属性的情况下在资源中ResourceDictionary声明时,x:Key 值使用属性的值TargetType。 如果隐式设置样式,则样式仅应用于与完全匹配 TargetType 且不应用于从值派生的元素的类型 TargetType 。 例如,如果为应用程序中的所有ToggleButton控件隐式创建样式,并且应用程序具有ToggleButtonCheckBox控件 (派生自ToggleButton) CheckBox,则“ToggleButton”隐式样式仅应用于ToggleButton控件。

适用于

另请参阅