Classi di impostazioni modello

Prerequisiti

Si presuppone che sia possibile aggiungere controlli all'interfaccia utente, impostarne le proprietà e collegare i gestori eventi. Per istruzioni sull'aggiunta di controlli all'app, vedi Aggiungere controlli e gestire eventi. Si supponga inoltre di conoscere le nozioni di base su come definire un modello personalizzato per un controllo creando una copia del modello predefinito e modificandola. Per altre info su questo argomento, vedi Modelli di controllo.

Scenario per le classi TemplateSettings

Le classi TemplateSettings forniscono un set di proprietà che vengono usate quando si definisce un nuovo modello di controllo per un controllo. Le proprietà hanno valori come misurazioni in pixel per le dimensioni di determinate parti dell'interfaccia utente. I valori sono talvolta valori derivati da calcoli, provenienti dalla logica di controllo che in genere non è facile sostituire o sono difficilmente accessibili. Alcune delle proprietà sono concepite come valori From e To che controllano le transizioni e le animazioni delle parti e quindi le proprietà TemplateSettings pertinenti sono disponibili in coppie.

Esistono diverse classi TemplateSettings . Tutti si trovano nello spazio dei nomi .Xaml.Controls.Primitives. Ogni classe ha una proprietà TemplateSettings associata nel controllo pertinente. Questa proprietà TemplateSettings consente di accedere ai valori TemplateSettings per il controllo e di stabilire associazioni di modelli alle relative proprietà.

Ecco alcuni esempi di classi e proprietà correlate:

Le proprietà TemplateSettings sono sempre destinate all'uso in XAML, non nel codice. Sono sottoproprietà di sola lettura di una proprietà TemplateSettings di sola lettura di un controllo padre. Per uno scenario di controllo personalizzato avanzato, in cui si crea una nuova classe basata su control e quindi può influenzare la logica di controllo, è consigliabile definire una proprietà TemplateSettings personalizzata sul controllo per comunicare informazioni utili per chiunque stia ricreando il controllo. Come valore di sola lettura di tale proprietà, definire una nuova classe TemplateSettings correlata al controllo, con proprietà di sola lettura per ogni elemento informativo pertinente alle misure del template, al posizionamento delle animazioni e così via, e fornire ai chiamanti l'istanza di runtime di tale classe, inizializzata utilizzando la logica di controllo. Le classi TemplateSettings sono derivate da DependencyObject, in modo che le proprietà possano usare il sistema di proprietà di dipendenza per i callback delle proprietà modificate. Gli identificatori delle proprietà di dipendenza per le proprietà non vengono tuttavia esposti come API pubblica, perché le proprietà TemplateSettings devono essere di sola lettura per i chiamanti.

Come usare TemplateSettings in un modello di controllo

Ecco un esempio proveniente dai modelli di controllo XAML predefiniti iniziali. Questo particolare è dal modello predefinito di ProgressRing:

<Ellipse
    x:Name="E1"
    Style="{StaticResource ProgressRingEllipseStyle}"
    Width="{Binding RelativeSource={RelativeSource TemplatedParent}, 
        Path=TemplateSettings.EllipseDiameter}"
    Height="{Binding RelativeSource={RelativeSource TemplatedParent}, 
        Path=TemplateSettings.EllipseDiameter}"
    Margin="{Binding RelativeSource={RelativeSource TemplatedParent}, 
        Path=TemplateSettings.EllipseOffset}"
    Fill="{TemplateBinding Foreground}"/>

Il codice XAML completo per il modello ProgressRing è costituito da centinaia di righe, quindi questo è solo un piccolo estratto. Questo codice XAML definisce una parte di controllo che è uno dei 6 elementi Ellipse che ritraggono l'animazione rotante per lo stato di avanzamento indeterminato. Come sviluppatore, potrebbe non piacerti usare i cerchi e potresti utilizzare una primitiva grafica diversa o una forma di base differente per come progredisce l'animazione. Ad esempio, è possibile comporre un ProgressRing che utilizza un set di elementi Rectangle disposti in un quadrato. In tal caso, ogni singolo componente Rectangle del nuovo modello potrebbe essere simile al seguente:

<Rectangle
    x:Name="R1"
    Width="{Binding RelativeSource={RelativeSource TemplatedParent}, 
        Path=TemplateSettings.EllipseDiameter}"
    Height="{Binding RelativeSource={RelativeSource TemplatedParent}, 
        Path=TemplateSettings.EllipseDiameter}"
    Margin="{Binding RelativeSource={RelativeSource TemplatedParent}, 
        Path=TemplateSettings.EllipseOffset}"
    Fill="{TemplateBinding Foreground}"/>

Il motivo per cui le proprietà TemplateSettings sono utili in questo caso è che sono valori calcolati provenienti dalla logica di controllo di base di ProgressRing. Il calcolo suddivide il valore complessivo di ActualWidth e ActualHeight del ProgressRing e assegna una misura calcolata a ciascuno degli elementi di movimento nei suoi modelli, in modo che le parti del modello possano adattarsi al contenuto.

Ecco un altro esempio di utilizzo dei modelli di controllo XAML predefiniti, questa volta che mostra uno dei set di proprietà che sono From e To di un'animazione. Si tratta del modello predefinito ComboBox :

<VisualStateGroup x:Name="DropDownStates">
    <VisualState x:Name="Opened">
        <Storyboard>
            <SplitOpenThemeAnimation
               OpenedTargetName="PopupBorder"
               ContentTargetName="ScrollViewer"
               ClosedTargetName="ContentPresenter"
               ContentTranslationOffset="0"
               OffsetFromCenter="{Binding RelativeSource={RelativeSource TemplatedParent}, 
                 Path=TemplateSettings.DropDownOffset}"
               OpenedLength="{Binding RelativeSource={RelativeSource TemplatedParent}, 
                 Path=TemplateSettings.DropDownOpenedHeight}"
               ClosedLength="{Binding RelativeSource={RelativeSource TemplatedParent},
                 Path=TemplateSettings.DropDownClosedHeight}" />
        </Storyboard>
   </VisualState>
...
</VisualStateGroup>

Anche in questo caso, nel modello è presente un sacco di CODICE XAML, quindi viene visualizzato solo un estratto. Ed è solo uno dei diversi stati e animazioni del tema che usano le stesse proprietà ComboBoxTemplateSettings . Per ComboBox, l'uso dei valori ComboBoxTemplateSettings tramite associazioni impone che le animazioni correlate nel modello si arresteranno e inizieranno in corrispondenza delle posizioni basate su valori condivisi e quindi passano senza problemi.

Annotazioni

Quando usi i valori TemplateSettings come parte del modello di controllo, assicurati di impostare le proprietà che corrispondono al tipo del valore. In caso contrario, potrebbe essere necessario creare un convertitore di valori per l'associazione in modo che il tipo di destinazione dell'associazione possa essere convertito da un tipo di origine diverso del valore TemplateSettings . Per altre info, vedi IValueConverter.