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


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

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

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

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

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

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

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

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

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

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