可重複使用的 EffectBehavior
對於將效果新增至控制項,行為是很實用的方法,可從程式碼後置檔案中移除以定案效果方式處理的程式碼。 本文示範如何建立和使用 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
實例。