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:
VisualElement.Triggers
eStyle.Triggers
di tipoIList<TriggerBase>
VisualElement.Behaviors
eStyle.Behaviors
di tipoIList<Behavior>
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 eventiDataTrigger
per le risposte basate sui data bindingMultiTrigger
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 tipoBindableProperty
Value
di tipoObject
Setters
di tipoIList<SetterBase>
, la proprietà content diTrigger
Inoltre, Trigger
richiede che la proprietà seguente ereditata da TriggerBase
sia impostata:
TargetType
per indicare il tipo dell'elemento su cuiTrigger
è associato
e Property
Value
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 EventTrigger
oggetto , che definisce due proprietà:
Event
di tipostring
, il nome di un eventoActions
di tipoIList<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:
EnterActions
di tipoIList<TriggerAction>
ExitActions
di tipoIList<TriggerAction>
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à :
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, è null
e 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à:
Conditions
di tipoIList<Condition>
Setters
di tipoIList<Setter>
Condition
è una classe astratta e ha due classi discendenti:
PropertyCondition
, che haProperty
proprietà eValue
comeTrigger
BindingCondition
, che haBinding
proprietà eValue
comeDataTrigger
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 aSwitch
Xamarin.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:
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 .