注意
這本書於2016年春季出版,此後一直沒有更新。 這本書中有很多仍然有價值,但一些材料已經過時,有些主題不再完全正確或完整。
觸發程式和行為很類似,因為它們都打算用於 XAML 檔案,以簡化數據系結以外的項目互動,以及擴充 XAML 元素的功能。 觸發程式和行為幾乎一律會與視覺使用者介面物件搭配使用。
若要支援觸發程式和行為, VisualElement 並 Style 同時支援兩個集合屬性:
VisualElement.Triggers型別為和Style.TriggersIList<TriggerBase>VisualElement.Behaviors型別為和Style.BehaviorsIList<Behavior>
觸發程序
觸發程式是一個條件(屬性變更或引發事件),會導致回應(另一個屬性變更或執行某些程序代碼)。 Triggers和 Style 的 VisualElement 屬性屬於 類型IList<TriggersBase>。 TriggerBase 是抽象類,其衍生了四個密封類別:
Trigger針對根據屬性變更的回應EventTrigger針對根據事件引發的回應DataTrigger以數據系結為基礎的回應MultiTrigger針對以多個觸發程式為基礎的回應
觸發程式一律會在觸發程式變更其屬性的項目上設定。
最簡單的觸發程式
類別 Trigger 會檢查屬性值的變更,並藉由設定相同元素的另一個屬性來回應。
Trigger 定義三個屬性:
此外, Trigger 還需要設定繼承自 TriggerBase 的下列屬性:
TargetType表示附加 之Trigger專案的型別
和 Property Value 組成條件,而且 Setters 集合是回應。 當 指定的 具有 所Value指示Property的值時,Setter就會套用集合中的 Setters 物件。 Property當 有不同的值時,會移除 setter。 Setter 定義兩個屬性,其與的前兩個屬性 Trigger相同:
EntryPop 範例示範當 的 屬性Entry為 true時IsFocused,套用至 Entry 的 如何Trigger透過 Scale 屬性增加的大小Entry。
雖然這並不常見, Trigger 但可以在程式代碼中設定 ,如 EntryPopCode 範例所示。
StyledTriggers 範例示範 如何在 Trigger 中Style設定 ,以套用至多個Entry元素。
觸發動作和動畫
您也可以根據觸發程式執行一些程序代碼。 此程式代碼可以是以屬性為目標的動畫。 其中一個常見方式是使用 ,其定義兩個 EventTrigger屬性:
若要使用此功能,您必須撰寫衍生自 TriggerAction<T>的類別,通常是 TriggerAction<VisualElement>。 您可以在這個類別中定義屬性。 這些是一般 CLR 屬性,而不是可繫結的屬性,因為 TriggerAction 不是因為衍生自 BindableObject。 您必須覆寫 Invoke 叫用動作時呼叫的方法。 自變數是目標專案。
Book.Toolkit 連結庫中的Xamarin.Forms 類別是範例。ScaleAction 它會呼叫 ScaleTo 屬性,以動畫顯示 Scale 項目的屬性。 因為其中一個屬性的類型是 Easing,類別 EasingConverter 可讓您在 XAML 中使用標準 Easing 靜態字段。
EntrySwell 範例示範如何從EventTrigger監視 Focused 和 Unfocused 事件的物件叫ScaleAction用 。
CustomEasingSwell 範例示範如何在程式代碼後置檔案中定義 的自定義 Easing 函ScaleAction式。
您也可以使用 來叫用Trigger動作(與 區別)。EventTrigger 這需要您知道定義 TriggerBase 兩個集合:
- 型別
EnterActions的IList<TriggerAction> - 型別
ExitActions的IList<TriggerAction>
EnterExitSwell 範例示範如何使用這些集合。
更多事件觸發程式
Book.Toolkit 連結庫中的Xamarin.Forms 類別會呼叫ScaleTo兩次以相應增加和減少。ScaleUpAndDownAction ButtonGrowth 範例會在按下 時Button使用樣式EventTrigger來提供視覺回饋。 這個雙精度動畫也可以使用 類型集合中的兩個動作 DelayedScaleAction
Book.Toolkit 連結ShiverAction庫中的 Xamarin.Forms類別會定義可自定義的顫抖動作。 ShiverButtonDemo 範例會示範它。
Book.Toolkit 連結NumericValidationAction庫中的Xamarin.Forms類別限制為Entry元素,如果屬性不是 double,則會將 TextColor Text 屬性設定為紅色。 TriggerEntryValidation 範例會示範它。
資料觸發程序
DataTrigger與 類似Trigger,不同之處在於,其會監視數據系結,而不是監視屬性值變更。 這可讓某個元素中的屬性影響另一個元素中的屬性。
DataTrigger 定義三個屬性:
GenderColors 範例需要 SchoolOfFineArt 連結庫,並根據 屬性將學生名稱的色彩設定為藍色或粉紅色:Sex
如果 屬性的Entry屬性等於 0,ButtonEnabler 範例會將 IsEnabled 的 屬性EntryText設定為Length False 請注意,屬性 Text 會初始化為空字串;預設為 null,且 DataTrigger 無法正確運作。
在 MultiTrigger 中結合條件
MultiTrigger是條件的集合。 當它們全部時 true,就會套用 setter。 類別會定義兩個屬性:
- 型別
Conditions的IList<Condition> - 型別
Setters的IList<Setter>
Condition 是抽象類,而且有兩個子代類別:
PropertyCondition,其具有Property和Value屬性,例如TriggerBindingCondition,其具有Binding和Value屬性,例如DataTrigger
在 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 。
切換和複選框
您可以封裝類別中切換按鈕的行為,例如 ToggleBehavior Xamarin.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 範例會針對已核取和未核取按鈕之間的外觀差異使用 Style 。 RadioImages 範例會針對其單選按鈕使用 Boxed 影像:
TraditionalRadios 範例會繪製傳統出現的單選按鈕,內有圓點。
淡出和方向
MultiColorSliders 的最終範例可讓您使用單選按鈕,在三個不同的色彩選取檢視之間切換。 這三個FadeEnableActionXamarin.Forms檢視會在 Book.Toolkit 文件庫中使用 淡入和淡出。
此程式也會使用 GridOrientationBehavior Book.Toolkit 文件庫中的 Xamarin.Forms,回應直向與橫向之間的變更。

