マップ ビヘイビアーの作成
マップ ビヘイビアーを使用すると、ArcGIS Viewer for Silverlight に、常に有効にする機能を簡単に実装できます。マップ ビヘイビアーで実装した機能はユーザの明示的な操作を必要としません。ビューアの読み込み時に常に開始する必要があるビューアのロジックを開発している場合、そのロジックはビヘイビアーとしてカプセル化する必要があります。ビヘイビアーは、たとえば、マップを特定の範囲に維持するような場合に使用できます。
詳細については、「ベスト プラクティス: はじめに」および「ArcGIS Viewer for Silverlight の拡張」をご参照ください。
ビューアで使用するために開発するビヘイビアーは、System.Windows.Interactivity.Behavior<ESRI.ArcGIS.Client.Map> から継承する必要があります。Behavior<T> 基本クラスはいくつかのシンプルなメンバーで構成されます。ビューアでは、これらのメンバーは次のように理解できます。
- AssociatedObject - このプロパティは、対象ビヘイビアーをアタッチするオブジェクトを表します。ビューア アドインでは、これはマップ オブジェクトになります。
- OnAttached - 対象ビヘイビアーをオブジェクトにアタッチするときに呼び出されるメソッド。このメソッドをオーバーライドして初期化ロジックを実行します。ビューアでは、ビヘイビアーをマップにアタッチしたときにこのメソッドが実行されます。ビヘイビアーは、次のいずれかの場合にアタッチされます。
- ビューアの読み込み時
- [ビヘイビアーの管理] ダイアログ ボックスを使用してユーザがビヘイビアーを追加または有効化したとき
- OnDetaching - 対象ビヘイビアーをオブジェクトからデタッチするときに呼び出されるメソッド。このメソッドをオーバーライドして、削除イベント ハンドラなどの消去ロジックを実行します。ビューアでは、ユーザが [マップ ビヘイビアー] ダイアログ ボックスを使用してビヘイビアーを削除または無効化したときに、このメソッドが呼び出されます。
ビヘイビアーを Application Builder に追加できるようにするには、次の 2 つの属性をビヘイビアー クラスに追加する必要があります。1 つめに追加する属性は System.ComponentModel.Composition.ExportAttribute で、これは、Microsoft の Managed Extensibility Framework(MEF)の一部として提供される System.ComponentModel.Composition アセンブリに含まれています。この属性は、ビヘイビアーを使用可能にする必要があることを Application Builder に伝えます。実装するビヘイビアーにこの属性を追加する場合、常に次の形式を取る必要があります。
[Export(typeof(Behavior<Map>))]
public class MyBehavior : Behavior<Map>
追加する必要があるもう 1 つの属性は、ESRI.ArcGIS.Client.Extensibility.DisplayNameAttribute です。この属性は、ビヘイビアーをビューアに追加するときに設計者に対して表示される、ビヘイビアーの名前を決めるものです。ESRI.ArcGIS.Client.Extensibility アセンブリから指定できる追加のオプション属性には、CategoryAttribute や DescriptionAttribute などがあります。この属性は次のように指定します。
[Export(typeof(Behavior<Map>))]
[DisplayName("Show Current Extent")]
[Category("My Behaviors")]
[Description("Shows a message box with the current extent when the extent changes")]
public class MyBehavior : Behavior<Map>
単純なビヘイビアーの例を以下に示します。ここでは、ビヘイビアーがマップにアタッチされた時点で、そのマップの ExtentChanged イベントにハンドラを追加し、ビヘイビアーがデタッチされた時点でハンドラを削除します。さらに、範囲が変更されたとき、現在の範囲を示すメッセージ ボックスを表示します。
[Export(typeof(Behavior<Map>))]
[DisplayName("Simple Behavior")]
[Category("My Behaviors")]
[Description("Shows a message box with the current extent when the extent changes")]
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(object 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;
}
}