マップ ビヘイビアーの作成
マップ ビヘイビアーを使用すると、Map Web パーツで常に有効にする機能を簡単に実装できます。Map Web パーツに追加する機能や、Map Web パーツに対する変更を常に有効にする場合は、それらをマップ ビヘイビアーとしてカプセル化します。たとえば、マップの特定の範囲を表示したり、JavaScript または Silverlight メッセージでメソッドを実行したりする場合にマップ ビヘイビアーを使用します。
Map Web パーツ用として開発するビヘイビアーは、System.Windows.Interactivity.Behavior<ESRI.ArcGIS.Client.Map> を継承する必要があります。Behavior<T> 基本クラスはいくつかのシンプルなメンバーで構成されます。Map Web パーツでは、これらのメンバーを次のように使用します。
- AssociatedObject - このプロパティは、対象ビヘイビアーをアタッチするオブジェクトを表します。Map Web パーツ エクステンションの場合、このオブジェクトはマップ オブジェクトになります。
- OnAttached - 対象ビヘイビアーをオブジェクトにアタッチするときに呼び出されるメソッド。このメソッドをオーバーライドして初期化ロジックを実行します。Map Web パーツの場合、このメソッドは、対象ビヘイビアーをマップにアタッチするときに呼び出されます。具体的な状況は次のとおりです。
- Web パーツが読み込まれたとき
- ユーザが [ビヘイビアーの管理] ダイアログ ボックスを使用して、対象ビヘイビアーを追加または有効化したとき
- OnDetaching - 対象ビヘイビアーをオブジェクトからデタッチするときに呼び出されるメソッド。このメソッドをオーバーライドして、削除イベント ハンドラなどの消去ロジックを実行します。Map Web パーツの場合、このメソッドは、ユーザが [ビヘイビアーの管理] ダイアログ ボックスを使用して対象ビヘイビアーを削除または無効化するときに呼び出されます。
デザイン担当者がビヘイビアーを Map Web パーツへ追加できるようにするには、ビヘイビアー クラスに 2 つの属性を追加する必要があります。その 1 つは System.ComponentModel.Composition.ExportAttribute です。この属性は、Managed Extensibility Framework(MEF)を構成する System.ComponentModel.Composition アセンブリに含まれています。この属性は、ビヘイビアーを使用可能にする必要があることを Map Web パーツに通知します。実装するビヘイビアーにこの属性を追加する場合、必ず次の形式をとります。
[Export(typeof(Behavior<Map>))]
public class MyBehavior : Behavior<Map>
追加するもう 1 つの属性は ESRI.ArcGIS.Client.Extensibility.DisplayNameAttribute です。この属性は、デザイン担当者が対象ビヘイビアーを Map Web パーツへ追加するときに表示される名前を指定します。この属性は次のように指定します。
[Export(typeof(Behavior<Map>))]
[DisplayName("<Name to display>")]
public class MyBehavior : Behavior<Map>
次に、単純なビヘイビアーのコード例を示します。ここでは、ビヘイビアーがマップにアタッチされた時点で、そのマップの ExtentChanged イベントにハンドラを追加し、ビヘイビアーがデタッチされた時点でハンドラを削除します。さらに、範囲が変更されたとき、現在の範囲を示すメッセージ ボックスを表示します。
[Export(typeof(Behavior<Map>))]
[DisplayName("Simple Behavior")]
public class MyBehavior : Behavior<Map>
{
protected override void OnAttached()
{
base.OnAttached();
// Add a handler to the map's ExtentChanged event.
this.AssociatedObject.ExtentChanged += OnExtentChanged;
}
private void OnExtentChanged(sender s, ExtentEventArgs args)
{
// Show a message box with the new extent.
MessageBox.Show(this.AssociatedObject.Extent.ToString());
}
protected override void OnDetaching()
{
// Remove the handler from the map's ExtentChanged event.
this.AssociatedObject.ExtentChanged -= OnExtentChanged;
}
}