ビヘイビアーは、コントロールにエフェクトを追加するために役立つ方法です。エフェクトを処理する定型コードを分離コード ファイルから削除します。 この記事では、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 インスタンスを削除します。