第 23 章的摘要。 觸發程序和行為
注意
這本書於2016年春季出版,此後一直沒有更新。 這本書中有很多仍然有價值,但一些材料已經過時,有些主題不再完全正確或完整。
觸發程式和行為很類似,因為它們都打算用於 XAML 檔案,以簡化數據系結以外的項目互動,以及擴充 XAML 元素的功能。 觸發程式和行為幾乎一律會與視覺使用者介面物件搭配使用。
若要支援觸發程式和行為, VisualElement
並 Style
同時支援兩個集合屬性:
VisualElement.Triggers
型別為和Style.Triggers
IList<TriggerBase>
VisualElement.Behaviors
型別為和Style.Behaviors
IList<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
的 屬性Entry
Text
設定為Length
False
請注意,屬性 Text
會初始化為空字串;預設為 null
,且 DataTrigger
無法正確運作。
在 MultiTrigger 中結合條件
MultiTrigger
是條件的集合。 當它們全部時 true
,就會套用 setter。 類別會定義兩個屬性:
- 型別
Conditions
的IList<Condition>
- 型別
Setters
的IList<Setter>
Condition
是抽象類,而且有兩個子代類別:
PropertyCondition
,其具有Property
和Value
屬性,例如Trigger
BindingCondition
,其具有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 連結庫中的ValidEmailBehavior
Xamarin.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 的最終範例可讓您使用單選按鈕,在三個不同的色彩選取檢視之間切換。 這三個FadeEnableAction
Xamarin.Forms檢視會在 Book.Toolkit 文件庫中使用 淡入和淡出。
此程式也會使用 GridOrientationBehavior
Book.Toolkit 文件庫中的 Xamarin.Forms,回應直向與橫向之間的變更。