Control.Template Propriedade
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Obtém ou define um modelo de controle. O modelo de controle define a aparência visual de um controle na interface do usuário e é definido na marcação 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>
Valor da propriedade
O modelo que define a aparência do Controle. O ControlTemplate deve ter exatamente um elemento raiz como seu conteúdo.
Exemplos
Este exemplo mostra um modelo de controle mais completo definido como um Style e Setter com o valor Setter.Property de "Template". Esse é um estilo nomeado para um controle RadioButton . Ele inclui os elementos de modelo que normalmente fazem parte de um modelo de controle funcional, como um elemento de propriedade anexado anexado ao elemento raiz do modelo e valores de atributo x:Name atribuídos a cada uma VisualStateManager.VisualStateGroups
das partes de controle proeminentes.
<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>
Comentários
A segunda sintaxe XAML mostrada acima é uma sintaxe Setter como parte de um Style. É assim que um valor de modelo para um controle é definido em quase todos os casos.
TargetType é um atributo necessário em todos os elementos ControlTemplate usados como um valor de Modelo. O valor deve corresponder à propriedade TargetType para o Style que contém o Setter for Template, se você estiver usando uma sintaxe style-setter.
O ControlTemplate especifica a aparência de um Controle; se um Controle não tiver um ControlTemplate, o Controle não terá nenhuma presença visível em seu aplicativo. O autor do controle define o modelo de controle padrão e o autor do aplicativo pode reexametar o XAML ControlTemplate para redefinir a árvore visual do controle.
Os modelos de controle normalmente são definidos em XAML (Extensible Application Markup Language) como parte de um estilo implícito específico do controle. Nesse caso, um valor Property no Setter é definido como a cadeia de caracteres "Template", e o valor Setter.Value é definido como um elemento de propriedade, que contém um elemento de objeto ControlTemplate . Por exemplo, esse é o Estilo que define um valor de modelo para um ScrollViewer. Este é um exemplo de um estilo implícito, em que o Estilo pode estar em um ResourceDictionary , mas não precisa de um atributo 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>
Estilos e modelos
Você pode usar um Setter em um Style para aplicar valores a qualquer propriedade de dependência. Mas é o Setter para a propriedade Template de uma classe derivada de Control que constitui a maioria da marcação XAML em um estilo típico. Quando um Style é usado para definir um modelo de controle, o TargetType do elemento Style e o TargetType do elemento ControlTemplate para seu setter Control.Template sempre devem usar o mesmo valor. O setter de modelo define a definição básica de interface do usuário de modelo para um controle em que esse modelo é aplicado. Ele também contém os estados visuais de um controle e outras definições de interface do usuário baseadas em estado, como transições de tema padrão. Para um controle complexo, como ListBox, o modelo padrão Style e o ControlTemplate dentro podem ter centenas de linhas de XAML. Para obter mais informações sobre a função de Modelo em cenários de modelagem de controle, consulte Modelos de controle XAML.
Estilos implícitos
Você pode definir estilos de modo que um Style seja usado implicitamente por todos os objetos do mesmo TargetType, sem exigir que cada instância desse objeto referencie especificamente o valor Style as a FrameworkElement.Style . Quando um <Style>
recurso é declarado em um ResourceDictionary sem um atributo x:Key, o valor x:Key usa o valor da propriedade TargetType . Se você definir o estilo implicitamente, o estilo será aplicado somente aos tipos que correspondem exatamente ao TargetType e não aos elementos derivados do valor TargetType . Por exemplo, se você criar um estilo implicitamente para todos os controles ToggleButton em seu aplicativo e seu aplicativo tiver controles ToggleButton e CheckBox (CheckBox deriva de ToggleButton), o estilo implícito "ToggleButton" será aplicado somente aos controles ToggleButton .