Zusammenfassung von Kapitel 23. Trigger und Verhalten
Hinweis
Dieses Buch wurde im Frühjahr 2016 veröffentlicht und seitdem nicht aktualisiert. Wenngleich ein großer Teil des Buchs weiterhin relevante Informationen liefert, sind einige Abschnitte veraltet, und einige Themen sind nicht mehr korrekt oder vollständig.
Trigger und Verhalten sind dahingehend ähnlich, dass beide für die Verwendung in XAML-Dateien vorgesehen sind, um Elementinteraktionen über die Verwendung von Datenbindungen hinaus zu vereinfachen und um die Funktionalität von XAML-Elementen zu erweitern. Sowohl Trigger als auch Verhalten werden praktisch immer mit visuellen Benutzeroberflächenobjekten verwendet.
Um Trigger und Verhalten zu unterstützen, unterstützen sowohl VisualElement
als auch Style
zwei Sammlungseigenschaften:
VisualElement.Triggers
undStyle.Triggers
vom TypIList<TriggerBase>
.VisualElement.Behaviors
undStyle.Behaviors
vom TypIList<Behavior>
.
Auslöser
Ein Trigger ist eine Bedingung (eine Eigenschaftsänderung oder das Auslösen eines Ereignisses), die zu einer Reaktion führt (eine andere Eigenschaftsänderung oder das Ausführen von Code). Die Triggers
-Eigenschaft von VisualElement
und Style
ist vom Typ IList<TriggersBase>
. TriggerBase
ist eine abstrakte Klasse, von der vier versiegelte Klassen abgeleitet werden:
Trigger
für Reaktionen auf der Grundlage von Eigenschaftsänderungen.EventTrigger
für Reaktionen auf Grundlage von Ereignisauslösungen.DataTrigger
für Reaktionen auf Grundlage von Datenbindungen.MultiTrigger
für Reaktionen auf der Grundlage mehrerer Trigger.
Der Trigger wird immer für das-Element festgelegt, dessen Eigenschaft durch den Trigger geändert wird.
Der einfachste Trigger
Die Trigger
-Klasse überprüft, ob ein Eigenschaftswert geändert wird, und reagiert durch Festlegen einer anderen Eigenschaft desselben Elements.
Trigger
definiert drei Eigenschaften:
Property
vom TypBindableProperty
Value
vom TypObject
Setters
vom TypIList<SetterBase>
, die Inhaltseigenschaft (Content) vonTrigger
.
Außerdem erfordert Trigger
, dass die folgende, von TriggerBase
geerbte Eigenschaft festgelegt wird:
TargetType
, um den Typ des Elements anzugeben, an den derTrigger
angefügt ist.
Property
und Value
bilden die Bedingung, und die Setters
-Sammlung ist die Reaktion. Wenn die angezeigte Property
den von Value
angegebenen Wert hat, werden die Setter
-Objekte in der Setters
-Sammlung angewendet. Wenn Property
einen anderen Wert aufweist, werden die Setter entfernt. Setter
definiert zwei Eigenschaften, die mit den ersten beiden Eigenschaften von Trigger
identisch sind:
Im EntryPop-Beispiel wird veranschaulicht, wie ein auf Entry
angewendeter Trigger
die Größe von Entry
über die Scale
-Eigenschaft erhöhen kann, wenn die IsFocused
-Eigenschaft von Entry
true
ist.
Obwohl es nicht üblich ist, kann Trigger
im Code festgelegt werden, wie das EntryPopCode-Beispiel veranschaulicht.
Das StyledTriggers-Beispiel veranschaulicht, wie Trigger
in einem Style
festgelegt werden kann, um auf mehrere Entry
-Elemente angewendet zu werden.
Triggeraktionen und Animationen
Es ist auch möglich, bei einem Trigger ein kleines Stück Code auszuführen. Dieser Code kann eine Animation sein, die auf eine Eigenschaft abzielt. Eine gängige Methode ist die Verwendung eines EventTrigger
, der zwei Eigenschaften definiert:
Event
vom Typstring
, der Name eines Ereignisses.Actions
vom TypIList<TriggerAction>
, eine Liste von als Reaktion auszuführenden Aktionen.
Um dies zu verwenden, müssen Sie eine Klasse schreiben, die von TriggerAction<T>
abgeleitet wird, generell TriggerAction<VisualElement>
. Sie können in dieser Klasse Eigenschaften definieren. Dabei handelt es sich eher um einfache CLR-Eigenschaften als um bindbare Eigenschaften, da TriggerAction
nicht von BindableObject
abgeleitet wird. Sie müssen die Invoke
-Methode außer Kraft setzen, die aufgerufen wird, wenn die Aktion aufgerufen wird. Das Argument ist das Zielelement.
Die ScaleAction
-Klasse in der Bibliothek Xamarin.FormsBook.Toolkit ist ein Beispiel. Sie ruft die ScaleTo
-Eigenschaft auf, um die Scale
-Eigenschaft eines Elements zu animieren. Da eine ihrer Eigenschaften vom Typ Easing
ist, können Sie mit der EasingConverter
-Klasse die statischen Easing
-Standardfelder in XAML verwenden.
Das EntrySwell-Beispiel veranschaulicht, wie Sie die ScaleAction
aus EventTrigger
-Objekten aufrufen, die die Ereignisse Focused
und Unfocused
überwachen.
Das CustomEasingSwell-Beispiel zeigt, wie Sie eine benutzerdefinierte Beschleunigungsfunktion für ScaleAction
in einer CodeBehind-Datei definieren.
Sie können Aktionen auch mit einem Trigger
aufrufen (zu unterscheiden von EventTrigger
). Hierfür müssen Sie sich bewusst sein, dass TriggerBase
zwei Sammlungen definiert:
EnterActions
vom TypIList<TriggerAction>
ExitActions
vom TypIList<TriggerAction>
Im EnterExitSwell-Beispiel wird veranschaulicht, wie diese Sammlungen verwendet werden.
Weitere Ereignistrigger
Die ScaleUpAndDownAction
-Klasse in der Bibliothek Xamarin.FormsBook.Toolkit ruft ScaleTo
zweimal auf, um zentral hoch- und herunterzuskalieren. Das ButtonGrowth-Beispiel verwendet dieses in einem formatierten EventTrigger
, um visuelles Feedback bereitzustellen, wenn auf einen Button
gedrückt wird. Diese doppelte Animation lässt sich auch mit zwei Aktionen in der Sammlung vom Typ DelayedScaleAction
erzeugen.
Die ShiverAction
-Klasse in der Bibliothek Xamarin.FormsBook.Toolkit definiert eine anpassbare Zitteraktion (Shiver). Dies wird im ShiverButtonDemo-Beispiel veranschaulicht.
Die NumericValidationAction
-Klasse in der Bibliothek Xamarin.FormsBook.Toolkit ist auf Entry
-Elemente beschränkt und legt die TextColor
-Eigenschaft auf „Rot“ fest, wenn die Text
-Eigenschaft nicht den Typ double
hat. Dies wird im TriggerEntryValidation-Beispiel veranschaulicht.
Datentrigger
DataTrigger
ähnelt dem Trigger
, mit der Ausnahme, dass keine Eigenschaft auf Wertänderungen überwacht wird, sondern eine Datenbindung. Dadurch kann eine Eigenschaft in einem Element eine Eigenschaft in einem anderen Element beeinflussen.
DataTrigger
definiert drei Eigenschaften:
Das GenderColors-Beispiel erfordert die Bibliothek SchoolOfFineArt und legt die Farben der Namen der Kursteilnehmer auf „Blau“ oder „Rosa“ fest, basierend auf ihrer Sex
-Eigenschaft:
Im ButtonEnabler-Beispiel wird die IsEnabled
-Eigenschaft eines Entry
auf False
festgelegt, wenn die Length
-Eigenschaft der Text
-Eigenschaft von Entry
gleich 0 ist. Beachten Sie, dass die Text
-Eigenschaft mit einer leeren Zeichenfolge initialisiert wird. Der Standardwert ist null
, und der DataTrigger
würde nicht richtig funktionieren.
Kombinieren von Bedingungen im „MultiTrigger“
MultiTrigger
ist eine Sammlung von Bedingungen. Wenn sie alle true
sind, werden Setter angewendet. Die Klasse definiert zwei Eigenschaften:
Conditions
vom TypIList<Condition>
Setters
vom TypIList<Setter>
Condition
ist eine abstrakte Klasse und verfügt über zwei untergeordnete Klassen:
PropertyCondition
, dieProperty
- undValue
-Eigenschaften wieTrigger
besitzt.BindingCondition
, dieBinding
- undValue
-Eigenschaften wieDataTrigger
besitzt.
Im AndConditions-Beispiel wird eine BoxView
nur dann eingefärbt, wenn vier Switch
-Elemente alle aktiviert sind.
Im OrConditions-Beispiel wird veranschaulicht, wie Sie eine BoxView
einfärben können, wenn beliebige der vier Switch
-Elemente aktiviert sind. Hierfür muss das De Morgansche Gesetz angewendet und die gesamte Logik umgekehrt werden.
Das Kombinieren von AND- und OR-Logik ist nicht ganz einfach und erfordert in der Regel unsichtbare Switch
-Elemente für Zwischenergebnisse. Das XorConditions-Beispiel veranschaulicht, wie ein Button
aktiviert werden kann, wenn in eins der beiden Entry
-Elemente ein Text eingegeben wird, aber nicht, wenn in beide Text eingegeben wird.
Verhalten
Alles, was Sie mit einem Trigger machen können, können Sie auch mit einem Verhalten erreichen, aber Verhalten erfordern immer eine Klasse, die von Behavior<T>
abgeleitet wird und die folgenden zwei Methoden außer Kraft setzt:
Das Argument ist das-Element, an das das Verhalten angefügt ist. Generell fügt die OnAttachedTo
-Methode einige Ereignishandler an, und OnDetachingFrom
trennt diese. Da eine solche Klasse normalerweise einen Zustand speichert, kann Sie generell nicht in einem Style
gemeinsam genutzt werden.
BehaviorEntryValidation-Beispiel ähnelt TriggerEntryValidation, mit der Ausnahme, dass es ein Verhalten verwendet – die NumericValidationBehavior
Klasse in der Xamarin.FormsBook.Toolkit-Bibliothek.
Verhalten mit Eigenschaften
Behavior<T>
wird von Behavior
abgeleitet, das von BindableObject
abgeleitet wird, weshalb für ein Verhalten bindbare Eigenschaften definiert werden können. Diese Eigenschaften können in Datenbindungen aktiv sein.
Dieser Vorgang wird im EmailValidationDemo-Programm veranschaulicht, das die ValidEmailBehavior
-Klasse in der Bibliothek Xamarin.FormsBook.Toolkit verwendet. ValidEmailBehavior
verfügt über eine schreibgeschützte, bindbare Eigenschaft und fungiert als Quelle in Datenbindungen.
Das EmailValidationConv-Beispiel verwendet dieses selbe Verhalten zum Anzeigen eines anderen Typs von Indikator, um zu signalisieren, dass eine E-Mail-Adresse gültig ist.
Das EmailValidationTrigger-Beispiel ist eine Abwandlung des vorherigen Beispiels. „ButtonGlide“ verwendet einen DataTrigger
in Kombination mit diesem Verhalten.
Umschaltflächen und Kontrollkästchen
Es ist möglich, das Verhalten einer Umschaltfläche in einer Klasse wie ToggleBehavior
in der Bibliothek Xamarin.FormsBook.Toolkit zu kapseln und dann alle visuellen Elemente für die Umschaltfläche vollständig in XAML zu definieren.
Im ToggleLabel-Beispiel wird das ToggleBehavior
mit einem DataTrigger
verwendet, um ein Label
mit zwei Textzeichenfolgen für die Umschaltfläche zu verwenden.
Das FormattedTextToggle-Beispiel erweitert dieses Konzept, indem es zwischen zwei FormattedString
-Objekten wechselt.
Die ToggleBase
-Klasse in der Bibliothek Xamarin.FormsBook.Toolkit wird von ContentView
abgeleitet, definiert eine IsToggled
-Eigenschaft und enthält ein ToggleBehavior
für die Umschaltlogik. Dies erleichtert das Definieren der Umschaltfläche in XAML, wie im TraditionalCheckBox-Beispiel veranschaulicht.
Die SwitchCloneDemo enthält eine SwitchClone
Klasse, die von ToggleBase
einer Klasse abgeleitet wird und eine TranslateAction
Klasse verwendet, um eine Umschaltfläche zu erstellen, die dem Xamarin.FormsSwitch
ähnelt.
Eine RotateAction
in der Bibliothek Xamarin.FormsBook.Toolkit stellt eine Animation bereit, die verwendet wird, um einen animierten Hebel im LeverToggle-Beispiel zu erstellen.
Reagieren auf Tippen
Ein Nachteil von EventTrigger
besteht darin, dass Sie ihn nicht an einen TapGestureRecognizer
anfügen können, um auf Tippen zu reagieren. Die Umgehung dieses Problems ist der Zweck von TapBehavior
in der Bibliothek Xamarin.FormsBook.Toolkit.
Das BoxViewTapShiver-Beispiel verwendet TapBehavior
, um die frühere ShiverAction
für BoxView
-Elemente zu verwenden, auf die getippt wurde.
Das ShiverViews-Beispiel zeigt, wie sich das Markup durch Kapseln einer ShiverView
-Klasse verringern lässt.
Optionsfelder
Die Bibliothek Xamarin.FormsBook.Toolkit enthält auch eine RadioBehavior
-Klasse zum Erstellen von Optionsfeldern, die mithilfe eines string
-Gruppennamens gruppiert werden.
Das RadioLabels-Programm verwendet Textzeichenfolgen für seine Optionsfelder. Das RadioStyle-Beispiel verwendet einen Style
für den Darstellungsunterschied zwischen aktivierten und deaktivierten Schaltflächen. Das RadioImages-Beispiel verwendet Bilder mit Rahmen für seine Optionsfelder:
Im TraditionalRadios-Beispiel werden traditionell aussehende Optionsfelder mit einem Punkt in einem Kreis gezeichnet.
Blenden und Ausrichtung
Das letzte Beispiel, MultiColorSliders, gestattet es Ihnen, mithilfe von Optionsfeldern zwischen drei verschiedenen Farbauswahlansichten zu wechseln. Die drei Ansichten werden mithilfe einer FadeEnableAction
in der Bibliothek Xamarin.FormsBook.Toolkit ein- und ausgeblendet.
Das Programm reagiert auch auf Änderungen der Ausrichtung zwischen Hochformat und Querformat mithilfe eines GridOrientationBehavior
in der Bibliothek Xamarin.FormsBook.Toolkit.