ベスト プラクティス: ダイアログ ボックスの設計と表示
ダイアログ ボックスを設計してマップ アプリケーションに表示する場合、UI(ユーザ インタフェース)の表示方法、全体的なデザインとテーマ、既存のアプリケーション フレームワークとスムーズに統合する方法など、さまざまな要素を考慮しなければなりません。ダイアログ ボックスを閉じる直前や閉じた後、何らかの操作(マップからレイヤを削除するなど)を実行するかどうかも決める必要があります。
UI の表示
ビューア 内に UI(ダイアログ ボックス)を表示するため、拡張 API には 2 つのメソッド(ShowWindow と HideWindow)が用意されています。これらのメソッドは MapApplication.Current に属しています。MapApplication.Current.ShowWindow メソッドは、フローティング ダイアログ ウィンドウに FrameworkElement を表示します。ダイアログ ボックスを開くには、ダイアログ ボックスのタイトルに表示するオブジェクトを文字列として ShowWindow メソッドに渡します。ShowWindow メソッドは、ダイアログ ボックスがモーダルかどうかを判断するブール値、ダイアログ ボックスを閉じる直前に呼び出されるイベント ハンドラ、ダイアログ ボックスを閉じた直後に呼び出されるイベント ハンドラを必要に応じて受け入れます。ダイアログ ボックスを閉じるには、同じ FrameworkElement を MapApplication.Current.HideWindow メソッドに渡します。
コマンドを実装する場合は、該当するボタンがクリックされた直後(コマンドが実行された直後)に UI を表示します。さらに、コマンドの実行時にユーザがマップを操作する必要がある場合は、UI でそれを示さなければなりません。
ShowWindow を使用するときは、UI の背景を透明に設定してください。UI を含むダイアログ ボックスでは、アプリケーションのテーマ カラーに基づく背景色が使用されます。ただしこれは、アプリケーションを設計するユーザが変更できます。
ビューアに Silverlight UI を表示する例として、次のように、デフォルトのコードビハインド クラスと XAML(Extensible Application Markup Language)を使用する UserControl を実装するとします。
<UserControl x:Class="MyExtension.SimpleDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">
<Grid x:Name="LayoutRoot" Background="Transparent">
<TextBlock Text="This is my Silverlight UI!" Margin="20" />
</Grid>
</UserControl>
ツールが実行されたとき、このコントロールをダイアログ ボックスに表示するには、次のように実装します。
[Export(typeof(ICommand))]
[DisplayName("Show A Simple Dialog")]
[Category("My Tools")]
[Description("Tool to show a simple dialog")]
[DefaultIcon("<Insert path to icon>")]
public class ShowDialogCommand : ICommand
{
private SimpleDialog dialog = null;
public void Execute(object parameter)
{
// Instantiate a new dialog if one does not already exist.
dialog = dialog ?? new SimpleDialog();
// Display the dialog.
MapApplication.Current.ShowWindow("Simple Dialog", dialog);
}
public bool CanExecute(object parameter)
{
// Return true so that the command is always enabled.
return true;
}
public event EventHandler CanExecuteChanged;
}
デフォルトのテーマの ビューアでは、このダイアログは次のように表示されます。
レイアウトのカスタマイズ
フローティング ダイアログに表示したくない UI(パネルなど)をアプリケーションに追加するには、レイアウトをカスタマイズします。UI を常に表示する場合は、その UI をレイアウトに追加します。UI の表示/非表示をユーザが切り替えられるようにするには、次の方法があります。
- 閉じるボタンなど、Visibility プロパティを Collapsed に設定するコントロールを UI に追加します。
- MapApplication.Current.FindControlInLayout を使用して対象コントロールを検出するツールを作成(ICommand を実装)し、その Visibilityプロパティを Visible に設定します。
レイアウトに必ずしも UI が含まれるとは限らないので、FindControlInLayout が NULL を返すケースも処理できるようにしてください。
ビジュアル ツリーをプログラムから操作してエレメントをアプリケーションへ動的に追加しないでください。この方法ではビジュアル ツリーを特別な方法で構成する必要があるため不安定になります。この処理を実行するコードは、レイアウト間およびリリース間で停止する可能性があります。
詳細については、「カスタム レイアウトの作成」をご参照ください。また、ArcGIS Viewer for Silverlightインタラクティブ サンプルで、Controls セクションのサンプルもご参照ください。
ブラシ
Extensibility アセンブリには、ビューアで使用するブラシ セットが用意されています。UI に色を付けるときは、これらの組み込みブラシ セットを使用してください。標準ブラシを使用することで、UI の色とアプリケーションの色の一貫性が維持されます。また、エンド ユーザは、テーマ コントロールを使用してこれらの色を構成できます。
次のブラシを使用できます。
- BackgroundGradientBrush - デフォルトのレイアウト セットでは、このブラシが主要背景色として使用されます。ダイアログ ボックスおよびサイド パネルの背景色としても使用します。
- BackgroundStartGradientStopColorBrush - BackgroundGradientBrush の開始色を表します。
- BackgroundEndGradientStopColorBrush - BackgroundGradientBrush の終了色を表します。
- BackgroundTextColorBrush - 背景ブラシに重ね合わせるテキストの色として使用します。
- AccentColorBrush - デフォルトのレイアウト セットで、背景色のコントラストとして使用します。たとえば、枠線、スクロールバー、ボタンなどでこの色を使用します。
- AccentTextColorBrush - 背景色のブラシに重ね合わせるテキストの色として使用します。
- SelectionColorBrush - 選択されたエレメントの色として使用します。たとえば、マップ コンテンツで選択されたレイヤをハイライト表示するときなどに使用します。
- SelectionOutlineColorBrush - SelectionColorBrush と併用し、選択アイテムの輪郭を示します。マップ コンテンツで選択されたレイヤの輪郭を示すときに使用します。
ダイアログ ボックスを閉じるときの処理
アドインによって表示されたウィンドウをユーザが閉じる時点で処理を実行するには、MapApplication.Current.ShowWindow メソッドの onHidingHandler パラメータ、onHideHandler パラメータ、のどちらかまたは両方のパラメータにイベント ハンドラを渡します。
- onHidingHandler - ウィンドウを閉じる前にロジックを実行できます。さらに必要であれば、ウィンドウを閉じる操作をキャンセルできます。たとえば、何らかの操作中にユーザがウィドウを閉じたとき、その操作を中止するかどうかを確認するメッセージを表示する場合などに使用します。
- onHideHandler - ウィンドウを閉じた後でロジックを実行できます。たとえば、結果として作成されたレイヤをマップから削除する場合などに使用します。