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 должен иметь ровно один корневой элемент в качестве его содержимого.
Примеры
В этом примере показан более полный шаблон элемента управления, определенный в качестве стиля и задания со значением 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 для стиля , содержащего метод Setter для шаблона, если используется синтаксис набора стилей.
Элемент ControlTemplate указывает внешний вид элемента управления; Если элемент управления не имеет controlTemplate, элемент управления не будет отображаться в приложении. Автор элемента управления определяет шаблон элемента управления по умолчанию, а автор приложения может повторно шаблонировать XAML ControlTemplate , чтобы переопределить визуальное дерево элемента управления.
Шаблоны элементов управления обычно задаются в языке разметки расширяемых приложений (XAML) в рамках неявного стиля элемента управления. В этом случае значение свойства в 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>
Стили и шаблоны
Для применения значений к любому свойству зависимостей можно использовать метод Setter в стиле . Но это метод Setter для свойства Template класса, производного от элемента управления, который представляет большую часть разметки XAML в типичном стиле. Если стиль используется для определения шаблона элемента управления, TargetType элемента Style и TargetType элемента ControlTemplate для его элемента Control.Template setter всегда должен использовать одно и то же значение. Средство задания шаблонов определяет базовое определение шаблона пользовательского интерфейса для элемента управления, в котором применяется этот шаблон. Он также содержит визуальные состояния для элемента управления и другие определения пользовательского интерфейса на основе состояния, такие как переходы темы по умолчанию. Для сложного элемента управления, например ListBox, стиль шаблона по умолчанию и ControlTemplate могут содержать сотни строк XAML. Дополнительные сведения о роли шаблона в сценариях шаблонов управления см. в шаблонах элементов управления XAML Control.
Неявные стили
Вы можете определить стили таким образом, чтобы стиль использовался неявно всеми объектами одного и того же TargetType, не требуя, чтобы каждый экземпляр такого объекта специально ссылался на style как значение FrameworkElement.Style .
<Style> Если ресурс объявлен в ResourceDictionary без атрибута x:Key, значение x:Key использует значение свойства TargetType. Если стиль задан неявно, стиль применяется только к типам, которые соответствуют TargetType точно и не к элементам, производным от значения TargetType . Например, если вы создаете стиль неявно для всех элементов управления ToggleButton в приложении, а в приложении есть элементы управления ToggleButton и CheckBox (CheckBox , производные от ToggleButton), неявный стиль ToggleButton применяется только к элементам управления ToggleButton .