Teilen über


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:

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 Typ BindableProperty
  • Value vom Typ Object
  • Setters vom Typ IList<SetterBase>, die Inhaltseigenschaft (Content) von Trigger.

Außerdem erfordert Trigger, dass die folgende, von TriggerBase geerbte Eigenschaft festgelegt wird:

  • TargetType, um den Typ des Elements anzugeben, an den der Trigger 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 Typ string, der Name eines Ereignisses.
  • Actions vom Typ IList<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:

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:

Dreifacher Screenshot von Farben für Geschlechter

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:

Condition ist eine abstrakte Klasse und verfügt über zwei untergeordnete Klassen:

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:

Dreifacher Screenshot von Optionsfeldbildern

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.