Control.Template Proprietà

Definizione

Ottiene o imposta un modello di controllo. Il modello di controllo definisce l'aspetto visivo di un controllo nell'interfaccia utente ed è 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 illustrato un modello di controllo più completo definito come Style e Setter con valore Setter.Property di "Template". Si tratta di uno stile denominato per un controllo RadioButton . Include gli elementi modello che fanno normalmente parte di un modello di controllo funzionale, ad esempio un VisualStateManager.VisualStateGroups elemento proprietà associata collegato all'elemento radice del modello e i valori dell'attributo x:Name assegnati a ognuna delle parti di controllo prominenti.

<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 in precedenza è una sintassi Setter come parte di uno stile. Questo è il modo in cui un valore modello per un controllo viene definito in quasi tutti i casi.

TargetType è un attributo obbligatorio per tutti gli elementi ControlTemplate usati come valore Template. Il valore deve corrispondere alla proprietà TargetTypeper style che contiene il setter per Template, se si usa una sintassi style-setter.

ControlTemplate specifica l'aspetto di un controllo; se un controllo non dispone di controlTemplate, 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ò rimodellare il codice XAML ControlTemplate per ridefinire la struttura ad albero visuale del controllo.

I modelli di controllo vengono in genere impostati in XAML (Extensible Application Markup Language) come parte di uno stile implicito specifico del controllo. In questo caso, un valore Property in Setter viene impostato come stringa "Template" e il valore Setter.Value viene impostato come elemento proprietà, che contiene un elemento dell'oggetto ControlTemplate . Ad esempio, si tratta dello stile che definisce un valore template per un controllo ScrollViewer. Questo è un esempio di stile implicito, in cui lo stile può trovarsi in un oggetto ResourceDictionary , ma non richiede 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 un tipico stile. Quando un oggetto Style viene utilizzato per definire un modello di controllo, il TargetType dell'elemento Style e l'elemento TargetType dell'elemento ControlTemplate per il relativo setter Control.Template devono usare sempre lo stesso valore. Il setter modello definisce la definizione dell'interfaccia utente basato su modelli di base per un controllo in cui viene applicato il modello. Contiene anche gli stati di visualizzazione per un controllo e altre definizioni dell'interfaccia utente basate sullo stato, ad esempio transizioni di tema predefinite. Per un controllo complesso, ad esempio ListBox, lo stile del modello predefinito e controlTemplate all'interno può avere centinaia di righe di XAML. Per altre info sul ruolo di Modello negli scenari di creazione di modelli di controllo, vedi Modelli di controllo XAML.

Stili impliciti

È possibile definire stili in modo che uno Style venga utilizzato in modo implicito da tutti gli oggetti dello stesso TargetType, senza richiedere a ogni istanza di tale oggetto di fare riferimento in modo specifico a Style 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 .

Si applica a

Vedi anche