再利用可能な EffectBehavior

Download Sampleサンプルのダウンロード

ビヘイビアーは、コントロールにエフェクトを追加するために役立つ方法です。エフェクトを処理する定型コードを分離コード ファイルから削除します。 この記事では、Xamarin.Forms のビヘイビアーを作成および使用して、コントロールにエフェクトを追加する方法を示します。

概要

EffectBehavior クラスは再利用可能な Xamarin.Forms カスタム ビヘイビアーであり、このビヘイビアーがコントロールにアタッチされるとき、コントロールに Effect インスタンスを追加し、コントロールからデタッチされるとき、Effect インスタンスを削除します。

ビヘイビアーを使用するには、次のビヘイビアー プロパティを設定する必要があります。

エフェクトの詳細については、エフェクトに関するページを参照してください。

Note

EffectBehavior は、エフェクト ビヘイビアー サンプルに配置できるカスタム クラスであり、Xamarin.Forms の一部ではありません。

ビヘイビアーの作成

EffectBehavior クラスは Behavior<T> クラスから派生します。TView です。 つまり、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 コントロールによって表示されるテキストに影が追加されます。

Sample Application with EffectsBehavior

このビヘイビアーを使用してコントロールとの間でエフェクトを追加/削除することの長所は、エフェクトを処理する定型コードを分離コード ファイルから削除できることです。

まとめ

この記事では、ビヘイビアーを使用してエフェクトをコントロールに追加しました。 EffectBehavior クラスは再利用可能な Xamarin.Forms カスタム ビヘイビアーであり、このビヘイビアーがコントロールにアタッチされるとき、コントロールに Effect インスタンスを追加し、コントロールからデタッチされるとき、Effect インスタンスを削除します。