建立 Xamarin.Forms 行為
Xamarin.Forms 行為是由衍生自 Behavior 或 Behavior<T> 類別所建立。 本文示範如何建立和使用 Xamarin.Forms 行為。
概觀
建立 Xamarin.Forms 行為的程式如下:
- 建立繼承自
Behavior
或是Behavior<T>
類別的類別,其中T
是應該套用行為的控制項類型。 - 覆寫
OnAttachedTo
方法,以執行任何必要的設定。 - 覆寫
OnDetachingFrom
方法,以執行任何必要的清除。 - 實作行為的核心功能。
這會導致下列程式碼範例所示的結構:
public class CustomBehavior : Behavior<View>
{
protected override void OnAttachedTo (View bindable)
{
base.OnAttachedTo (bindable);
// Perform setup
}
protected override void OnDetachingFrom (View bindable)
{
base.OnDetachingFrom (bindable);
// Perform clean up
}
// Behavior implementation
}
當行為附加至控制項後,立即引發 OnAttachedTo
方法。 這個方法會接收到其附加至控制項的參考,並可用來註冊事件處理常式,或執行其他支援行為功能的必要設定。 例如,您可以訂閱控制項上的事件。 然後,就可以用事件的事件處理常式來實作行為功能。
從控制項移除行為時會引發 OnDetachingFrom
方法。 這個方法會接收到其附加至的控制項參考,並用以執行任何必要的清除。 例如,您可以取消訂閱控制項上的事件來防止記憶體流失。
然後就可以將行為附加至適當控制項的 Behaviors
集合來使用行為。
建立 Xamarin.Forms 行為
此範例應用程式會示範 NumericValidationBehavior
,其以紅色醒目提示使用者輸入 Entry
控制項的值,如果值不是 double
。 此行為會顯示在下列程式碼範例中:
public class NumericValidationBehavior : Behavior<Entry>
{
protected override void OnAttachedTo(Entry entry)
{
entry.TextChanged += OnEntryTextChanged;
base.OnAttachedTo(entry);
}
protected override void OnDetachingFrom(Entry entry)
{
entry.TextChanged -= OnEntryTextChanged;
base.OnDetachingFrom(entry);
}
void OnEntryTextChanged(object sender, TextChangedEventArgs args)
{
double result;
bool isValid = double.TryParse (args.NewTextValue, out result);
((Entry)sender).TextColor = isValid ? Color.Default : Color.Red;
}
}
NumericValidationBehavior
衍生自 Behavior<T>
類別,其中 T
是 Entry
。 OnAttachedTo
方法會註冊 TextChanged
事件的事件處理常式,以 OnDetachingFrom
方法取消註冊 TextChanged
事件來防止記憶體流失。 行為的核心功能是由 OnEntryTextChanged
方法提供,它會剖析使用者輸入 Entry
的值,並將 TextColor
屬性設為紅色,如果值不是 double
。
注意
Xamarin.Forms 不會設定 BindingContext
行為的 ,因為行為可以透過樣式共用並套用至多個控件。
取用 Xamarin.Forms 行為
每個 Xamarin.Forms 控件都有一個 Behaviors
集合,可以新增一或多個行為,如下列 XAML 程式代碼範例所示:
<Entry Placeholder="Enter a System.Double">
<Entry.Behaviors>
<local:NumericValidationBehavior />
</Entry.Behaviors>
</Entry>
下列程式碼範例顯示 C# 中的對等 Entry
:
var entry = new Entry { Placeholder = "Enter a System.Double" };
entry.Behaviors.Add (new NumericValidationBehavior ());
在執行階段,行為會根據行為實作回應與控制項的互動。 下列螢幕擷取畫面示範行為如何回應無效的輸入:
注意
行為是針對特定的控制項類型 (或可套用至許多控制項的 Superclass) 所撰寫,且應該只新增至相容的控制項。 嘗試將行為附加至不相容的控制項會導致擲回例外狀況。
使用 Xamarin.Forms 樣式取用行為
行為也可以明確或隱含樣式來使用。 但不能建立可設定控制項之 Behaviors
屬性的樣式,因為屬性為唯讀。 解決方案是將附加屬性新增至會控制新增和移除行為的行為類別。 此程序如下:
- 將附加屬性新增至行為類別,其用於控制所要附加之控制項的行為新增與移除。 請確保此附加屬性會註冊
propertyChanged
委派,當屬性值變更時,就會執行此委派。 - 建立附加屬性的
static
getter 和 setter。 - 實作
propertyChanged
委派中的邏輯,以新增和移除行為。
下列程式碼範例示範的附加屬性,會控制 NumericValidationBehavior
的新增和移除:
public class NumericValidationBehavior : Behavior<Entry>
{
public static readonly BindableProperty AttachBehaviorProperty =
BindableProperty.CreateAttached ("AttachBehavior", typeof(bool), typeof(NumericValidationBehavior), false, propertyChanged: OnAttachBehaviorChanged);
public static bool GetAttachBehavior (BindableObject view)
{
return (bool)view.GetValue (AttachBehaviorProperty);
}
public static void SetAttachBehavior (BindableObject view, bool value)
{
view.SetValue (AttachBehaviorProperty, value);
}
static void OnAttachBehaviorChanged (BindableObject view, object oldValue, object newValue)
{
var entry = view as Entry;
if (entry == null) {
return;
}
bool attachBehavior = (bool)newValue;
if (attachBehavior) {
entry.Behaviors.Add (new NumericValidationBehavior ());
} else {
var toRemove = entry.Behaviors.FirstOrDefault (b => b is NumericValidationBehavior);
if (toRemove != null) {
entry.Behaviors.Remove (toRemove);
}
}
}
...
}
NumericValidationBehavior
類別包含名為 AttachBehavior
並具有 static
getter 和 setter 的附加屬性,其控制所要附加之控制項的行為新增與移除。 此附加屬性會註冊 OnAttachBehaviorChanged
方法;當屬性的值變更時,就會執行此方法。 此方法會根據 AttachBehavior
附加屬性的值,新增或移除控制項的行為。
下列程式碼範例示範使用 AttachBehavior
附加屬性之 NumericValidationBehavior
的「明確」樣式,且可套用至 Entry
控制項:
<Style x:Key="NumericValidationStyle" TargetType="Entry">
<Style.Setters>
<Setter Property="local:NumericValidationBehavior.AttachBehavior" Value="true" />
</Style.Setters>
</Style>
使用 StaticResource
標記延伸將其 Style
屬性設為 Style
執行個體,Style
即可套用至 Entry
控制項,如下列程式碼範例所示:
<Entry Placeholder="Enter a System.Double" Style="{StaticResource NumericValidationStyle}">
如需樣式的詳細資訊,請參閱樣式。
注意
如果您確實建立了其狀態不應該在 ResourceDictionary
的 Style
控制項之間共用的行為,則您可以將可繫結的屬性新增至使用 XAML 所設定或查詢的行為。
移除控制項的行為
移除控制項的行為時,會引發 OnDetachingFrom
方法,並使用此方法執行任何必要的清除,例如取消訂閱事件,防止記憶體流失。 不過,除非控制項的 Behaviors
集合經 Remove
或 Clear
方法修改,否則不會以隱含方式移除控制項的行為。 下列程式碼範例示範移除控制項 Behaviors
集合中的特定行為:
var toRemove = entry.Behaviors.FirstOrDefault (b => b is NumericValidationBehavior);
if (toRemove != null) {
entry.Behaviors.Remove (toRemove);
}
或者,您也可以清除控制項的 Behaviors
集合,如下列程式碼範例所示:
entry.Behaviors.Clear();
另請注意,當頁面從導覽堆疊快顯時,控制項的行為不會以隱含方式移除。 而是必須在頁面超出範圍之前先明確移除它們。
摘要
本文示範如何建立和使用 Xamarin.Forms 行為。 Xamarin.Forms 行為是由衍生自 Behavior
或 Behavior<T>
類別所建立。