Control.Template Proprietà
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Ottiene o imposta un modello di controllo. Il modello di controllo definisce l'aspetto visivo di un controllo nell'interfaccia utente e viene definito nel markup 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>
Valore della proprietà
Modello che definisce l'aspetto del controllo. ControlTemplate deve avere esattamente un elemento radice come contenuto.
Esempio
In questo esempio viene visualizzato un modello di controllo più completo definito come stile e setter con il valore Setter.Property di "Modello". Questo è uno stile denominato per un controllo RadioButton . Include gli elementi del modello che fanno normalmente parte di un modello di controllo funzionale, ad esempio un elemento della proprietà associata VisualStateManager.VisualStateGroups collegato all'elemento radice del modello e i valori dell'attributo x:Name assegnati a ognuna delle parti di controllo principali.
<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>
Commenti
La seconda sintassi XAML illustrata sopra è una sintassi Setter come parte di uno stile. Questo è il modo in cui viene definito un valore modello per un controllo in quasi tutti i casi.
TargetType è un attributo obbligatorio per tutti gli elementi ControlTemplate usati come valore modello. Il valore deve corrispondere alla proprietà TargetTypeper style che contiene setter for Template, se si usa una sintassi style-setter.
ControlTemplate specifica l'aspetto di un controllo; se un controllo non ha un controlloTemplate, il controllo non avrà alcuna presenza visibile nell'app. L'autore del controllo definisce il modello di controllo predefinito e l'autore dell'app può rielaborare il codice XAML ControlTemplate per ridefinire l'albero visivo del controllo.
I modelli di controllo vengono in genere impostati in Extensible Application Markup Language (XAML) come parte di uno stile implicito specifico del controllo. In questo caso, un valore Property nel Setter viene impostato come stringa "Template" e il valore Setter.Value viene impostato come elemento della proprietà, che contiene un elemento oggetto ControlTemplate. Ad esempio, questo è lo stile che definisce un valore modello per un oggetto ScrollViewer. Questo è un esempio di stile implicito, in cui lo stile può trovarsi in un oggetto ResourceDictionary , ma non ha bisogno di un attributo 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>
Stili e modelli
È possibile usare un setter in uno stile per applicare valori a qualsiasi proprietà di dipendenza. Ma è il Setter per la proprietà Template di una classe derivata da Control che costituisce la maggior parte del markup XAML in uno stile tipico. Quando viene usato uno stile per definire un modello di controllo, targetType dell'elemento Style e targetType dell'elemento ControlTemplate per il setter Control.Template deve usare sempre lo stesso valore. Il setter modello definisce la definizione dell'interfaccia utente modello di base per un controllo in cui viene applicato il modello. Contiene anche gli stati visivi per un controllo e altre definizioni dell'interfaccia utente basate su stato, ad esempio transizioni di tema predefinite. Per un controllo complesso, ad esempio ListBox, lo stile predefinito del modello e il controlloTemplate all'interno possono avere centinaia di righe di XAML. Per altre informazioni sul ruolo del modello negli scenari di templating del controllo, vedere Avvio rapido: Modelli di controllo.
Stili impliciti
È possibile definire stili in modo che uno Stile venga usato in modo implicito da tutti gli oggetti dello stesso TargetType, senza richiedere a ogni istanza di tale oggetto di fare riferimento in modo specifico allo stile come valore FrameworkElement.Style . Quando una <Style>
risorsa viene dichiarata in un oggetto ResourceDictionary senza un attributo x:Key, il valore x:Key usa il valore della proprietà TargetType . Se si imposta lo stile in modo implicito, lo stile viene applicato solo ai tipi che corrispondono esattamente a TargetType e non agli elementi derivati dal valore TargetType . Ad esempio, se si crea uno stile in modo implicito per tutti i controlli ToggleButton nell'applicazione e l'applicazione dispone di controlli ToggleButton e CheckBox (CheckBox deriva da ToggleButton), lo stile implicito "ToggleButton" viene applicato solo ai controlli ToggleButton.