Поделиться через


Control.Template Свойство

Определение

Получает или задает шаблон элемента управления. Шаблон элемента управления определяет внешний вид элемента управления в пользовательском интерфейсе и определяется в разметке 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, показанный выше, является синтаксисом setter как частью стиля. Так определяется значение шаблона для элемента управления почти во всех случаях.

TargetType — это обязательный атрибут для всех элементов ControlTemplate , используемых в качестве значения шаблона. Значение должно соответствовать свойству TargetType для style , содержащего метод задания для шаблона, если используется синтаксис метода задания стилей.

ControlTemplate указывает внешний вид элемента управления; Если элемент управления не имеет controlTemplate, элемент управления не будет отображаться в вашем приложении. Автор элемента управления определяет шаблон элемента управления по умолчанию, а автор приложения может повторно создать шаблон XAML ControlTemplate , чтобы переопределить визуальное дерево элемента управления.

Шаблоны элементов управления обычно задаются на языке XAML как часть неявного стиля элемента управления. В этом случае значение Property в setter задается как строка "Template", а значение Setter.Value — как элемент свойства, который содержит элемент объекта ControlTemplate . Например, это стиль , определяющий значение шаблона для ScrollViewer. Это пример неявного стиля, в котором стиль может находиться в 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>

Стили и шаблоны

Метод задания в стиле можно использовать для применения значений к любому свойству зависимостей. Но именно метод задания для свойства Template класса, производного от control, составляет большую часть разметки XAML в типичном стиле. Если стиль используется для определения шаблона элемента управления, targetType элемента Style и TargetType элемента ControlTemplate для метода задания Control.Template всегда должны использовать одно и то же значение. Метод задания шаблонов определяет базовое определение шаблона пользовательского интерфейса для элемента управления, в котором применяется этот шаблон. Он также содержит визуальные состояния для элемента управления и другие определения пользовательского интерфейса на основе состояния, такие как переходы тем по умолчанию. Для сложного элемента управления, такого как ListBox, стандартный шаблон Style и ControlTemplate в могут содержать сотни строк XAML. Дополнительные сведения о роли шаблона в сценариях создания шаблонов элементов управления см. в разделе Шаблоны элементов управления XAML.

Неявные стили

Стили можно определить таким образом, чтобы стиль использовался неявно всеми объектами одного и того же TargetType, не требуя, чтобы каждый экземпляр такого объекта конкретно ссылался на Style в качестве значения FrameworkElement.Style . <Style> Если ресурс объявлен в ResourceDictionary без атрибута x:Key, значение x:Key использует значение свойства TargetType. Если задать стиль неявно, стиль применяется только к типам, точно соответствующим TargetType , а не к элементам, производным от значения TargetType . Например, если вы неявно создаете стиль для всех элементов управления ToggleButton в приложении, а в приложении есть элементы управления ToggleButton и CheckBox (CheckBox является производным от ToggleButton), неявный стиль ToggleButton применяется только к элементам управления ToggleButton .

Применяется к

См. также раздел