Condividi tramite


Riepilogo del capitolo 23. Trigger e comportamenti

Nota

Questo libro è stato pubblicato nella primavera del 2016, e non è stato aggiornato da allora. C'è molto nel libro che rimane prezioso, ma alcuni materiali sono obsoleti, e alcuni argomenti non sono più completamente corretti o completi.

I trigger e i comportamenti sono simili, in quanto sono entrambi progettati per essere usati nei file XAML per semplificare le interazioni degli elementi oltre l'uso dei data binding e per estendere la funzionalità degli elementi XAML. I trigger e i comportamenti sono quasi sempre usati con oggetti dell'interfaccia utente visiva.

Per supportare trigger e comportamenti, entrambi VisualElement e Style supportano due proprietà della raccolta:

Trigger

Un trigger è una condizione (una modifica di proprietà o la generazione di un evento) che genera una risposta (un'altra modifica della proprietà o l'esecuzione di codice). La Triggers proprietà di VisualElement e Style è di tipo IList<TriggersBase>. TriggerBase è una classe astratta da cui derivano quattro classi sealed:

  • Trigger per le risposte in base alle modifiche alle proprietà
  • EventTrigger per le risposte in base alle attivazioni degli eventi
  • DataTrigger per le risposte basate sui data binding
  • MultiTrigger per le risposte basate su più trigger

Il trigger viene sempre impostato sull'elemento la cui proprietà viene modificata dal trigger.

Trigger più semplice

La Trigger classe verifica la presenza di una modifica del valore di una proprietà e risponde impostando un'altra proprietà dello stesso elemento.

Trigger definisce tre proprietà:

  • Property di tipo BindableProperty
  • Value di tipo Object
  • Setters di tipo IList<SetterBase>, la proprietà content di Trigger

Inoltre, Trigger richiede che la proprietà seguente ereditata da TriggerBase sia impostata:

  • TargetType per indicare il tipo dell'elemento su cui Trigger è associato

e PropertyValue costituiscono la condizione e la Setters raccolta è la risposta. Quando l'oggetto indicato Property ha il valore indicato da Value, vengono applicati gli Setter oggetti nella Setters raccolta. Quando ha Property un valore diverso, i setter vengono rimossi. Setter definisce due proprietà uguali alle prime due proprietà di Trigger:

Nell'esempio EntryPop viene illustrato come un Trigger oggetto applicato a un Entry oggetto può aumentare le dimensioni dell'oggetto Entry tramite la Scale proprietà quando la IsFocused proprietà di Entry è true.

Anche se non è comune, può Trigger essere impostato nel codice, come dimostra l'esempio EntryPopCode .

Nell'esempio StyledTriggers viene illustrato come impostare l'oggetto Trigger in un Style oggetto da applicare a più Entry elementi.

Attivare azioni e animazioni

È anche possibile eseguire un po' di codice in base a un trigger. Questo codice può essere un'animazione destinata a una proprietà. Un modo comune consiste nell'usare un EventTriggeroggetto , che definisce due proprietà:

  • Event di tipo string, il nome di un evento
  • Actions di tipo IList<TriggerAction>, un elenco di azioni da eseguire in risposta.

Per usarlo, è necessario scrivere una classe che deriva da TriggerAction<T>, in genere TriggerAction<VisualElement>. È possibile definire le proprietà in questa classe. Si tratta di proprietà CLR semplici anziché proprietà associabili perché TriggerAction non derivano da BindableObject. È necessario eseguire l'override del Invoke metodo chiamato quando viene richiamata l'azione. L'argomento è l'elemento di destinazione.

La ScaleAction classe nella Xamarin.Formslibreria Book.Toolkit è un esempio. Chiama la ScaleTo proprietà per animare la Scale proprietà di un elemento. Poiché una delle relative proprietà è di tipo Easing, la EasingConverter classe consente di usare i campi statici standard Easing in XAML.

Nell'esempio EntrySwell viene illustrato come richiamare gli ScaleAction oggetti che EventTrigger monitorano gli Focused eventi e Unfocused .

L'esempio CustomEasingSwell mostra come definire una funzione di interpolazione personalizzata per ScaleAction in un file code-behind.

È anche possibile richiamare le azioni usando un oggetto Trigger ( come distinto da EventTrigger). Ciò richiede che siano presenti due TriggerBase raccolte:

L'esempio EnterExitSwell illustra come usare queste raccolte.

Altri trigger di evento

La ScaleUpAndDownAction classe nella Xamarin.Formslibreria Book.Toolkit chiama ScaleTo due volte per aumentare e ridurre le prestazioni. L'esempio ButtonGrowth usa questo oggetto in uno stile per EventTrigger fornire feedback visivo quando viene premuto un oggetto Button . Questa doppia animazione è anche possibile usando due azioni nella raccolta di tipo DelayedScaleAction

La ShiverAction classe nella Xamarin.Formslibreria Book.Toolkit definisce un'azione di brivido personalizzabile. L'esempio ShiverButtonDemo lo dimostra.

La NumericValidationAction classe nella Xamarin.Formslibreria Book.Toolkit è limitata agli Entry elementi e imposta la TextColor proprietà su rosso se la Text proprietà non è un oggetto double. L'esempio TriggerEntryValidation lo illustra.

Trigger di dati

è DataTrigger simile a Trigger , ad eccezione del fatto che invece di monitorare una proprietà per le modifiche di valore, esegue il monitoraggio di un data binding. Ciò consente a una proprietà in un elemento di influire su una proprietà in un altro elemento.

DataTrigger definisce tre proprietà:

L'esempio GenderColors richiede la libreria SchoolOfFineArt e imposta i colori dei nomi degli studenti su blu o rosa in base alla Sex proprietà :

Screenshot triplo dei colori di genere

L'esempio ButtonEnabler imposta la IsEnabled proprietà di un Entry oggetto su se la Length proprietà della Text proprietà di Entry è uguale a False 0. Si noti che la Text proprietà viene inizializzata in una stringa vuota. Per impostazione predefinita, è nulle non DataTrigger funziona correttamente.

Combinazione di condizioni in MultiTrigger

MultiTrigger è una raccolta di condizioni. Quando sono tutti true, vengono applicati setter. La classe definisce due proprietà:

Condition è una classe astratta e ha due classi discendenti:

Nell'esempio AndConditions un BoxView oggetto viene colorato solo quando quattro Switch elementi sono tutti attivati.

L'esempio OrConditions illustra come creare un BoxView colore quando uno dei quattro Switch elementi è attivato. Ciò richiede un'applicazione della legge di De Morgan e inverte tutta la logica.

La combinazione della logica AND e OR non è così semplice e in genere richiede elementi invisibili Switch per i risultati intermedi. Nell'esempio XorConditions viene illustrato come è possibile abilitare un oggetto Button se uno di due Entry elementi include testo digitato, ma non se entrambi hanno un testo digitato.

Comportamenti

Qualsiasi operazione che è possibile eseguire con un trigger, è anche possibile eseguire un comportamento, ma i comportamenti richiedono sempre una classe che deriva da Behavior<T> ed esegue l'override dei due metodi seguenti:

L'argomento è l'elemento a cui è associato il comportamento. In genere, il OnAttachedTo metodo associa alcuni gestori eventi e OnDetachingFrom li scollega. Poiché una classe di questo tipo in genere salva uno stato, in genere non può essere condivisa in un oggetto Style.

L'esempio BehaviorEntryValidation è simile a TriggerEntryValidation, ad eccezione del fatto che usa un comportamento, ovvero la NumericValidationBehavior classe nellaXamarin.Forms libreria Book.Toolkit.

Comportamenti con proprietà

Behavior<T> deriva da Behavior, che deriva da BindableObject, quindi è possibile definire proprietà associabili su un comportamento. Queste proprietà possono essere attive nei data binding.

Questo è illustrato nel programma EmailValidationDemo che usa la ValidEmailBehavior classe nella Xamarin.Formslibreria Book.Toolkit. ValidEmailBehavior dispone di una proprietà associabile di sola lettura e funge da origine nei data binding.

L'esempio EmailValidationConv usa questo stesso comportamento per visualizzare un altro tipo di indicatore per segnalare che un indirizzo di posta elettronica è valido.

L'esempio EmailValidationTrigger è una variante dell'esempio precedente. ButtonGlide usa un oggetto DataTrigger in combinazione con tale comportamento.

Attiva/disattiva e caselle di controllo

È possibile incapsulare il comportamento di un pulsante di attivazione/disattivazione in una classe, ad ToggleBehavior esempio nella Xamarin.Formslibreria Book.Toolkit, e quindi definire tutti gli oggetti visivi per l'interruttore interamente in XAML.

L'esempio ToggleLabel usa ToggleBehavior con un DataTrigger oggetto per usare un Label oggetto con due stringhe di testo per l'interruttore.

L'esempio FormattedTextToggle estende questo concetto passando da un oggetto all'altroFormattedString.

La ToggleBase classe nella Xamarin.Formslibreria Book.Toolkit deriva da ContentView, definisce una IsToggled proprietà e incorpora un ToggleBehavior oggetto per la logica di attivazione/disattivazione. In questo modo è più semplice definire l'interruttore in XAML, come illustrato dall'esempio TraditionalCheckBox .

SwitchCloneDemo include una SwitchClone classe che deriva da ToggleBase e usa una TranslateAction classe per costruire un pulsante di attivazione/disattivazione simile aSwitchXamarin.Forms .

Un RotateAction oggetto in Xamarin.FormsBook.Toolkit fornisce un'animazione usata per creare una leva animata nell'esempio LeverToggle .

Risposta ai tap

Uno svantaggio di EventTrigger è che non è possibile collegarlo a un TapGestureRecognizer oggetto per rispondere ai tap. Risolvere questo problema è lo scopo di TapBehavior in Xamarin.FormsBook.Toolkit

L'esempio BoxViewTapShiver usa TapBehavior per usare gli elementi toccati BoxView in precedenzaShiverAction.

L'esempio ShiverViews mostra come ridurre il markup incapsulando una ShiverView classe.

Pulsanti di opzione

La Xamarin.Formslibreria Book.Toolkit include anche una RadioBehavior classe per creare pulsanti di opzione raggruppati in base al nome di un string gruppo.

Il programma RadioLabels usa stringhe di testo per il pulsante di opzione. L'esempio RadioStyle usa un oggetto Style per la differenza di aspetto tra pulsanti controllati e deselezionati. L'esempio RadioImages usa immagini boxed per i pulsanti di opzione:

Screenshot triplo delle immagini radio

L'esempio TraditionalRadios disegna i pulsanti di opzione tradizionali con un punto all'interno di un cerchio.

Dissolvenza e orientamento

L'esempio finale, MultiColorSliders consente di passare da tre diverse visualizzazioni di selezione dei colori usando pulsanti di opzione. Le tre visualizzazioni svaniscono usando una FadeEnableAction nella Xamarin.Formslibreria Book.Toolkit.

Il programma risponde anche ai cambiamenti di orientamento tra verticale e orizzontale usando una GridOrientationBehavior nella Xamarin.Formslibreria Book.Toolkit .