マップ ビヘイビアーの作成

マップ ビヘイビアーを使用すると、ArcGIS Viewer for Silverlight に、常に有効にする機能を簡単に実装できます。マップ ビヘイビアーで実装した機能はユーザの明示的な操作を必要としません。ビューアの読み込み時に常に開始する必要があるビューアのロジックを開発している場合、そのロジックはビヘイビアーとしてカプセル化する必要があります。ビヘイビアーは、たとえば、マップを特定の範囲に維持するような場合に使用できます。

詳細については、「ベスト プラクティス: はじめに」および「ArcGIS Viewer for Silverlight の拡張」をご参照ください。

ビューアで使用するために開発するビヘイビアーは、System.Windows.Interactivity.Behavior<ESRI.ArcGIS.Client.Map> から継承する必要があります。Behavior<T> 基本クラスはいくつかのシンプルなメンバーで構成されます。ビューアでは、これらのメンバーは次のように理解できます。

ビヘイビアーを 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;
     }
}
1/23/2014