第 23 章的摘要。 觸發程序和行為

注意

這本書於2016年春季出版,此後一直沒有更新。 這本書中有很多仍然有價值,但一些材料已經過時,有些主題不再完全正確或完整。

觸發程式和行為很類似,因為它們都打算用於 XAML 檔案,以簡化數據系結以外的項目互動,以及擴充 XAML 元素的功能。 觸發程式和行為幾乎一律會與視覺使用者介面物件搭配使用。

若要支援觸發程式和行為, VisualElementStyle 同時支援兩個集合屬性:

觸發程序

觸發程式是一個條件(屬性變更或引發事件),會導致回應(另一個屬性變更或執行某些程序代碼)。 TriggersStyleVisualElement 屬性屬於 類型IList<TriggersBase>TriggerBase 是抽象類,其衍生了四個密封類別:

觸發程式一律會在觸發程式變更其屬性的項目上設定。

最簡單的觸發程式

類別 Trigger 會檢查屬性值的變更,並藉由設定相同元素的另一個屬性來回應。

Trigger 定義三個屬性:

  • 型別 PropertyBindableProperty
  • 型別 ValueObject
  • SettersIList<SetterBase>別為 的 ,其內容屬性為 Trigger

此外, Trigger 還需要設定繼承自 TriggerBase 的下列屬性:

  • TargetType 表示附加 之 Trigger 專案的型別

PropertyValue 組成條件,而且 Setters 集合是回應。 當 指定的 具有 所Value指示Property的值時,Setter就會套用集合中的 Setters 物件。 Property當 有不同的值時,會移除 setter。 Setter 定義兩個屬性,其與的前兩個屬性 Trigger相同:

EntryPop 範例示範當 的 屬性EntrytrueIsFocused,套用至 Entry 的 如何Trigger透過 Scale 屬性增加的大小Entry

雖然這並不常見, Trigger 但可以在程式代碼中設定 ,如 EntryPopCode 範例所示。

StyledTriggers 範例示範 如何在 TriggerStyle設定 ,以套用至多個Entry元素。

觸發動作和動畫

您也可以根據觸發程式執行一些程序代碼。 此程式代碼可以是以屬性為目標的動畫。 其中一個常見方式是使用 ,其定義兩個 EventTrigger屬性:

  • Eventstring別為 ,事件的名稱
  • ActionsIList<TriggerAction>別為 ,這是要響應中執行的動作清單。

若要使用此功能,您必須撰寫衍生自 TriggerAction<T>的類別,通常是 TriggerAction<VisualElement>。 您可以在這個類別中定義屬性。 這些是一般 CLR 屬性,而不是可繫結的屬性,因為 TriggerAction 不是因為衍生自 BindableObject。 您必須覆寫 Invoke 叫用動作時呼叫的方法。 自變數是目標專案。

Book.Toolkit 連結庫中的Xamarin.Forms 類別是範例。ScaleAction 它會呼叫 ScaleTo 屬性,以動畫顯示 Scale 項目的屬性。 因為其中一個屬性的類型是 Easing,類別 EasingConverter 可讓您在 XAML 中使用標準 Easing 靜態字段。

EntrySwell 範例示範如何從EventTrigger監視 FocusedUnfocused 事件的物件叫ScaleAction用 。

CustomEasingSwell 範例示範如何在程式代碼後置檔案中定義 的自定義 Easing 函ScaleAction式。

您也可以使用 來叫用Trigger動作(與 區別)。EventTrigger 這需要您知道定義 TriggerBase 兩個集合:

EnterExitSwell 範例示範如何使用這些集合。

更多事件觸發程式

Book.Toolkit 連結庫中的Xamarin.Forms 類別會呼叫ScaleTo兩次以相應增加和減少。ScaleUpAndDownAction ButtonGrowth 範例會在按下 時Button使用樣式EventTrigger來提供視覺回饋。 這個雙精度動畫也可以使用 類型集合中的兩個動作 DelayedScaleAction

Book.Toolkit 連結ShiverAction庫中的 Xamarin.Forms類別會定義可自定義的顫抖動作。 ShiverButtonDemo 範例會示範它。

Book.Toolkit 連結NumericValidationAction庫中的Xamarin.Forms類別限制為Entry元素,如果屬性不是 double,則會將 TextColorText 屬性設定為紅色。 TriggerEntryValidation 範例會示範它。

資料觸發程序

DataTrigger與 類似Trigger,不同之處在於,其會監視數據系結,而不是監視屬性值變更。 這可讓某個元素中的屬性影響另一個元素中的屬性。

DataTrigger 定義三個屬性:

GenderColors 範例需要 SchoolOfFineArt 連結庫,並根據 屬性將學生名稱的色彩設定為藍色或粉紅色:Sex

性別色彩的三重螢幕快照

如果 屬性的Entry屬性等於 0,ButtonEnabler 範例會將 IsEnabled 的 屬性EntryText設定為LengthFalse 請注意,屬性 Text 會初始化為空字串;預設為 null,且 DataTrigger 無法正確運作。

在 MultiTrigger 中結合條件

MultiTrigger是條件的集合。 當它們全部時 true,就會套用 setter。 類別會定義兩個屬性:

Condition 是抽象類,而且有兩個子代類別:

在 AndConditions 範例中BoxView只有在開啟四Switch個元素時,才會顯示色彩。

OrConditions 範例示範如何在開啟四Switch個元素中的任何一個專案BoxView製作色彩。 這需要對《德摩根法》進行應用,並扭轉所有邏輯。

結合 AND 和 OR 邏輯並不容易,而且通常需要不可見 Switch 的元素才能取得中繼結果。 XorConditions 範例示範如果兩Entry個元素中有一些輸入的文字,則如何Button啟用 ,但如果兩個元素都輸入某些文字,則無法啟用 。

行為

您可以使用觸發程式執行的任何動作,也可以使用行為來執行,但行為一律需要衍生自 Behavior<T> 的類別,並覆寫下列兩種方法:

自變數是附加行為的專案。 一般而言, OnAttachedTo 方法會附加一些事件處理程式,並 OnDetachingFrom 將它們中斷連結。 因為這類類別通常會儲存某些狀態,所以通常無法在 中 Style共用。

BehaviorEntryValidation 範例類似於 TriggerEntryValidation,不同之處在於它會使用行為 ,也就是 NumericValidationBehavior Book.Toolkit 連結庫中的 Xamarin.Forms類別。

具有屬性的行為

Behavior<T> 衍生自 Behavior,其衍生自 BindableObject,因此可以在行為上定義可系結的屬性。 這些屬性可以在數據系結中使用。

這會在 EmailValidationDemo 程式中示範,該程式會使用 Book.Toolkit 連結庫中的ValidEmailBehaviorXamarin.Forms 類別。 ValidEmailBehavior 具有唯讀可系結屬性,並做為數據系結中的來源。

EmailValidationConv 範例會使用相同的行為來顯示另一種類型的指標,以表示電子郵件位址有效。

EmailValidationTrigger 範例是上一個範例的變化。 ButtonGlide 會搭配該行為使用 DataTrigger

切換和複選框

您可以封裝類別中切換按鈕的行為,例如 ToggleBehaviorXamarin.FormsBook.Toolkit 連結庫中的切換按鈕,然後在 XAML 中完全定義切換的所有視覺效果。

ToggleLabel 範例會搭配 使用 ToggleBehavior 搭配 DataTrigger ,以搭配兩Label個文字字串進行切換。

FormattedTextToggle 範例會藉由切換兩個FormattedString對象來擴充此概念。

Book.Toolkit 連結ToggleBase庫中的Xamarin.Forms 類別衍生自 ContentView、定義 IsToggled 屬性,並併入ToggleBehavior切換邏輯的 。 這可讓您更輕鬆地在 XAML 中定義切換按鈕,如 TraditionalCheckBox 範例所示

SwitchCloneDemo 包含SwitchClone衍生自 ToggleBase 的類別,並使用 TranslateAction 類別來建構類似 的Xamarin.FormsSwitch切換按鈕。

RotateAction Book.Toolkit 中的Xamarin.Forms 提供動畫,用來在 LeverToggle 範例中製作動畫槓桿。

回應點選

EventTrigger 其中一個缺點是您無法將它附加至 TapGestureRecognizer 以響應點選。 解決這個問題是 Book.Toolkit 中Xamarin.Forms的目的TapBehavior

BoxViewTapShiver 範例會使用 TapBehavior 先前ShiverAction的點選BoxView元素。

ShiverViews 範例示範如何藉由封裝ShiverView類別來減少標記。

選項按鈕

Book.Toolkit 連結Xamarin.Forms庫也有一個RadioBehavior類別,可用來製作以組名分組string的單選按鈕。

RadioLabels 程式會為其單選按鈕使用文字字串。 RadioStyle 範例會針對已核取和未核取按鈕之間的外觀差異使用 StyleRadioImages 範例會針對其單選按鈕使用 Boxed 影像:

單選影像的三重螢幕快照

TraditionalRadios 範例會繪製傳統出現的單選按鈕,內有圓點。

淡出和方向

MultiColorSliders 的最終範例可讓您使用單選按鈕,在三個不同的色彩選取檢視之間切換。 這三個FadeEnableActionXamarin.Forms檢視會在 Book.Toolkit 文件庫中使用 淡入和淡出。

此程式也會使用 GridOrientationBehavior Book.Toolkit 文件庫中的 Xamarin.Forms,回應直向與橫向之間的變更。