對於將效果新增至控制項,行為是很實用的方法,可從程式碼後置檔案中移除以定案效果方式處理的程式碼。 本文示範如何建立和使用 Xamarin.Forms 行為,以將效果新增至控件。
概觀
類別 EffectBehavior 是可重複使用 Xamarin.Forms 的自定義行為,會在將行為附加至 控件時,將實例加入 Effect 控件中,並在行為與控件中斷連結時移除 Effect 實例。
您必須將下列行為屬性 (Property) 設定為使用行為:
- 群組 – 效果類別的
ResolutionGroupName屬性 (Attribute) 值。 - 名稱 – 效果類別的
ExportEffect屬性 (Attribute) 值。
如需效果的詳細資訊,請參閱效果。
注意
EffectBehavior是可位於範例中的自定義類別,不是的一Xamarin.Forms部分。
建立行為
EffectBehavior 類別衍生自 Behavior<T> 類別,其中 T 是 View。 這表示 EffectBehavior 類別可以附加至任何 Xamarin.Forms 控件。
實作可繫結屬性
EffectBehavior 類別會定義兩個 BindableProperty 執行個體,可在行為附加至控制項時,用來將 Effect 新增至控制項。 下列程式碼範例顯示這些屬性:
public class EffectBehavior : Behavior<View>
{
public static readonly BindableProperty GroupProperty =
BindableProperty.Create ("Group", typeof(string), typeof(EffectBehavior), null);
public static readonly BindableProperty NameProperty =
BindableProperty.Create ("Name", typeof(string), typeof(EffectBehavior), null);
public string Group {
get { return (string)GetValue (GroupProperty); }
set { SetValue (GroupProperty, value); }
}
public string Name {
get { return(string)GetValue (NameProperty); }
set { SetValue (NameProperty, value); }
}
...
}
使用 EffectBehavior 時,應該將 Group 屬性 (Property) 設定為值效果的 ResolutionGroupName 屬性 (Attribute) 值。 此外,還應該將 Name 屬性 (Property) 設定為值效果類別的 ExportEffect 屬性 (Attribute) 值。
實作覆寫
EffectBehavior 類別可覆寫 Behavior<T> 類別的 OnAttachedTo 和 OnDetachingFrom 方法,如下列程式碼範例所示:
public class EffectBehavior : Behavior<View>
{
...
protected override void OnAttachedTo (BindableObject bindable)
{
base.OnAttachedTo (bindable);
AddEffect (bindable as View);
}
protected override void OnDetachingFrom (BindableObject bindable)
{
RemoveEffect (bindable as View);
base.OnDetachingFrom (bindable);
}
...
}
OnAttachedTo 方法會呼叫 AddEffect 方法,並將附加的控制項作為參數傳入,以執行設定作業。 OnDetachingFrom 方法會呼叫 RemoveEffect 方法,並將附加的控制項作為參數傳入,以執行清除作業。
實作行為功能
行為的目的是要在行為附加至控制項時,將 Group 和 Name 屬性中定義的 Effect 新增至控制項,並在行為與控制項中斷連結時移除 Effect。 下列程式碼範例顯示核心行為功能:
public class EffectBehavior : Behavior<View>
{
...
void AddEffect (View view)
{
var effect = GetEffect ();
if (effect != null) {
view.Effects.Add (GetEffect ());
}
}
void RemoveEffect (View view)
{
var effect = GetEffect ();
if (effect != null) {
view.Effects.Remove (GetEffect ());
}
}
Effect GetEffect ()
{
if (!string.IsNullOrWhiteSpace (Group) && !string.IsNullOrWhiteSpace (Name)) {
return Effect.Resolve (string.Format ("{0}.{1}", Group, Name));
}
return null;
}
}
執行 AddEffect 方法以回應要附加至控制項的 EffectBehavior,其會接收附加的控制項作為參數。 此方法接著會將擷取的效果新增至控制項的 Effects 集合。 執行 RemoveEffect 方法以回應要從控制項中斷連結的 EffectBehavior,其會接收附加的控制項作為參數。 此方法接著會從控制項的 Effects 集合中移除效果。
GetEffect 方法使用 Effect.Resolve 方法來擷取此Effect。 效果是透過串連 Group 和 Name 屬性值來定位。 如果某個平台不提供效果,則 Effect.Resolve 方法會傳回非 null 值。
使用行為
您可以將 EffectBehavior 類別附加至控制項的 Behaviors 集合,如下列 XAML 程式碼範例所示:
<Label Text="Label Shadow Effect" ...>
<Label.Behaviors>
<local:EffectBehavior Group="Xamarin" Name="LabelShadowEffect" />
</Label.Behaviors>
</Label>
對等的 C# 程式碼會顯示在以下程式碼範例中:
var label = new Label {
Text = "Label Shadow Effect",
...
};
label.Behaviors.Add (new EffectBehavior {
Group = "Xamarin",
Name = "LabelShadowEffect"
});
行為的 Group 和 Name 屬性 (Property) 會設定為每個平台特定專案中效果類別的 ResolutionGroupName 和 ExportEffect 屬性 (Attribute) 值。
在執行階段中,當行為附加至 Label 控制項時,Xamarin.LabelShadowEffect 會新增至控制項的 Effects 集合。 這會導致將陰影新增至 Label 控制項所顯示的文字,如下列螢幕擷取畫面所示:

使用此行為在控制項中新增和移除效果的優點是:可以從程式碼後置檔案中移除以定案效果方式處理的程式碼。
摘要
本文示範如何使用行將效果新增至控制項。 類別 EffectBehavior 是可重複使用 Xamarin.Forms 的自定義行為,會在將行為附加至 控件時,將實例加入 Effect 控件中,並在行為與控件中斷連結時移除 Effect 實例。