Control.Template 属性

定义

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

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 必须恰好有一个根元素作为其内容。

示例

此示例演示定义为 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 语法是作为 Style 的一部分的 Setter 语法。 这是在几乎所有情况下定义 控件 的模板值的方式。

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

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

控件 模板通常在可扩展应用程序标记语言 (XAML) 中设置,作为特定于控件的隐式样式的一部分。 在这种情况下,Setter 中的 Property 值设置为字符串“Template”,Setter.Value 值设置为包含 ControlTemplate 对象元素的属性元素。 例如,这是为 ScrollViewer 定义 Template 值的 Style。 这是隐式样式的示例,其中 Style 可以位于 ResourceDictionary 中,但不需要 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>

样式和模板

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

隐式样式

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

适用于

另请参阅