マップ ビヘイビアーの作成
マップ ビヘイビアーは、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;
}
}