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 .