再利用可能な EffectBehavior
ビヘイビアーは、コントロールにエフェクトを追加するために役立つ方法です。エフェクトを処理する定型コードを分離コード ファイルから削除します。 この記事では、Xamarin.Forms のビヘイビアーを作成および使用して、コントロールにエフェクトを追加する方法を示します。
概要
EffectBehavior
クラスは再利用可能な Xamarin.Forms カスタム ビヘイビアーであり、このビヘイビアーがコントロールにアタッチされるとき、コントロールに Effect
インスタンスを追加し、コントロールからデタッチされるとき、Effect
インスタンスを削除します。
ビヘイビアーを使用するには、次のビヘイビアー プロパティを設定する必要があります。
- グループ – エフェクト クラスの
ResolutionGroupName
属性の値。 - 名前 – エフェクト クラスの
ExportEffect
属性の値。
エフェクトの詳細については、エフェクトに関するページを参照してください。
Note
EffectBehavior
は、サンプルに配置できるカスタム クラスであり、Xamarin.Forms の一部ではありません。
ビヘイビアーの作成
EffectBehavior
クラスは Behavior<T>
クラスから派生します。T
は View
です。 つまり、EffectBehavior
クラスはあらゆる Xamarin.Forms コントロールにアタッチできます。
バインド可能プロパティの実装
EffectBehavior
クラスによって 2 つの 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
プロパティをエフェクトの ResolutionGroupName
属性の値に設定する必要があります。 また、Name
プロパティをエフェクト クラスの ExportEffect
属性の値に設定する必要があります。
オーバーライドの実装
次のコード例に示すように、Behavior<T>
クラスの OnAttachedTo
メソッドと OnDetachingFrom
メソッドは EffectBehavior
クラスによってオーバーライドされます。
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;
}
}
コントロールにアタッチされている EffectBehavior
に応答して AddEffect
メソッドが実行されます。このメソッドでは、アタッチされているコントロールがパラメーターとして受け取られます。 次に、このメソッドによって、取得したエフェクトがコントロールの Effects
コレクションに追加されます。 コントロールからデタッチされている EffectBehavior
に応答して RemoveEffect
メソッドが実行されます。このメソッドでは、アタッチされているコントロールがパラメーターとして受け取られます。 次に、このメソッドによって、コントロールの Effects
コレクションからエフェクトが削除されます。
GetEffect
メソッドでは、Effect.Resolve
メソッドを使用して Effect
が取得されます。 エフェクトは、Group
プロパティ値と Name
プロパティ値の連結によって配置されます。 プラットフォームでエフェクトが提供されない場合、Effect.Resolve
メソッドでは、null
以外の値が返されます。
ビヘイビアーの使用
次の XAML コード例に示すように、コントロールの Behaviors
コレクションに EffectBehavior
クラスをアタッチできます。
<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
プロパティは、プラットフォーム固有のプロジェクトごとに、エフェクト クラスの ResolutionGroupName
属性と ExportEffect
属性の値に設定されます。
実行時、ビヘイビアーが Label
コントロールにアタッチされていると、コントロールの Effects
コレクションに Xamarin.LabelShadowEffect
が追加されます。 これにより、次のスクリーンショットに示すように、Label
コントロールによって表示されるテキストに影が追加されます。
このビヘイビアーを使用してコントロールとの間でエフェクトを追加/削除することの長所は、エフェクトを処理する定型コードを分離コード ファイルから削除できることです。
まとめ
この記事では、ビヘイビアーを使用してエフェクトをコントロールに追加しました。 EffectBehavior
クラスは再利用可能な Xamarin.Forms カスタム ビヘイビアーであり、このビヘイビアーがコントロールにアタッチされるとき、コントロールに Effect
インスタンスを追加し、コントロールからデタッチされるとき、Effect
インスタンスを削除します。