Control.Template Propiedad
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Obtiene o establece una plantilla de control. La plantilla de control define la apariencia visual de un control en la interfaz de usuario y se define en el marcado 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 de propiedad
Plantilla que define la apariencia del control. ControlTemplate debe tener exactamente un elemento raíz como su contenido.
Ejemplos
En este ejemplo se muestra una plantilla de control más completa definida como Style y Setter con el valor Setter.Property de "Template". Se trata de un estilo con nombre para un control RadioButton . Incluye los elementos de plantilla que normalmente forman parte de una plantilla de control funcional, como un VisualStateManager.VisualStateGroups
elemento de propiedad adjunta asociado al elemento raíz de la plantilla y los valores de atributo x:Name asignados a cada una de las partes de control destacadas.
<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>
Comentarios
La segunda sintaxis XAML mostrada anteriormente es una sintaxis setter como parte de un style. Así es como se define un valor de plantilla para un control en casi todos los casos.
TargetType es un atributo obligatorio en todos los elementos ControlTemplate usados como valor template. El valor debe coincidir con la propiedad TargetType del estilo que contiene el establecedor para plantilla, si usa una sintaxis de establecedor de estilo.
ControlTemplate especifica la apariencia de un control; Si un control no tiene controlTemplate, el control no tendrá presencia visible en la aplicación. El autor del control define la plantilla de control predeterminada y el autor de la aplicación puede volver a crear la plantilla xaml ControlTemplate para redefinir el árbol visual del control.
Normalmente , las plantillas de control se establecen en Lenguaje de marcado de aplicaciones extensibles (XAML) como parte de un estilo implícito específico del control. En este caso, se establece un valor Property en Setter como la cadena "Template" y el valor Setter.Value se establece como un elemento de propiedad, que contiene un elemento de objeto ControlTemplate . Por ejemplo, este es el estilo que define un valor de plantilla para un ScrollViewer. Este es un ejemplo de un estilo implícito, donde style puede estar en un ResourceDictionary , pero no necesita un 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 y plantillas
Puede usar un establecedor en un estilo para aplicar valores a cualquier propiedad de dependencia. Pero es el establecedor de la propiedad Template de una clase derivada de Control que constituye la mayoría del marcado XAML en un estilo típico. Cuando se usa un style para definir una plantilla de control, el TargetType del elemento Style y el TargetType del elemento ControlTemplate para su establecedor Control.Template siempre deben usar el mismo valor. El establecedor de plantillas define la definición básica de la interfaz de usuario con plantilla para un control donde se aplica esa plantilla. También contiene los estados visuales de un control y otras definiciones de interfaz de usuario basadas en estado, como transiciones de tema predeterminadas. Para un control complejo, como ListBox, la plantilla predeterminada Style y controlTemplate dentro pueden tener cientos de líneas de XAML. Para obtener más información sobre el rol de Plantilla en escenarios de plantillas de control, consulta Plantillas de control XAML.
Estilos implícitos
Puede definir estilos de forma que todos los objetos targetType usen implícitamente un estilo, sin necesidad de que cada instancia de un objeto de este tipo haga referencia específicamente al estilo como un valor FrameworkElement.Style. Cuando un <Style>
recurso se declara en un ResourceDictionary sin un atributo x:Key, el valor x:Key usa el valor de la propiedad TargetType . Si establece el estilo implícitamente, el estilo solo se aplica a los tipos que coinciden exactamente con TargetType y no a los elementos derivados del valor TargetType . Por ejemplo, si crea un estilo implícitamente para todos los controles ToggleButton de la aplicación y la aplicación tiene controles ToggleButton y CheckBox (CheckBox deriva de ToggleButton), el estilo implícito "ToggleButton" solo se aplica a los controles ToggleButton .