これを行うには2つの良い方法があります。1)ダイアログサービス(簡単、クリーン)、および2)ビュー支援。View Assistedは、いくつかの優れた機能を提供しますが、通常は価値がありません。
対話サービス
a)コンストラクターや依存関係コンテナーなどのダイアログサービスインターフェイス:
interface IDialogService
{
Task ShowDialogAsync(DialogViewModel dlgVm);
}
b)IDialogServiceの実装はウィンドウを開く(またはアクティブウィンドウにコントロールを挿入する)必要があります。指定されたdlgVmタイプの名前に対応するビューを作成します(コンテナー登録または規則、またはタイプに関連付けられたDataTemplatesのContentPresenterを使用)。ShowDialogAsyncはTaskCompletionSourceを作成し、その.Taskプロパティを返す必要があります。DialogViewModelクラス自体は、閉じるときに派生クラスで呼び出すことができるイベントを必要とし、ダイアログビューで監視して実際にダイアログを閉じる/非表示にし、TaskCompletionSourceを完了します。
b)使用するには、いくつかのDialogViewModel派生クラスのインスタンスでawait this.DialogService.ShowDialog(myDlgVm)を呼び出すだけです。awaitが戻った後、ダイアログVMに追加したプロパティを見て、何が起こったかを判断します。コールバックすら必要ありません。
アシストを表示
これにより、ビューがビューモデルのイベントをリッスンします。これはすべて、ブレンドビヘイビアにまとめて、コードビハインドやリソースの使用を回避することができます(FMI、「Behavior」クラスをサブクラス化して、ステロイドの一種のBlendable添付プロパティを表示する)。ここでは、各ビューでこれを手動で行います。
a)カスタムペイロード(DialogViewModel派生クラス)でOpenXXXXXDialogEventを作成します。
b)ビューのOnDataContextChangedイベントでイベントをサブスクライブします。古い値!= nullおよびウィンドウのUnloadedイベントの場合は、必ず非表示にしてサブスクライブを解除してください。
c)イベントが発生したら、ビューを開いてビューを開きます。ビューはページのリソースにある場合があります。または、慣例により(ダイアログサービスアプローチのように)場所を特定できます。
このアプローチはより柔軟ですが、使用するにはさらに多くの作業が必要です。あまり使いません。1つの優れた利点は、たとえば、ビューを物理的にタブ内に配置できることです。アルゴリズムを使用して現在のユーザーコントロールの境界に配置するか、十分に大きくない場合は、十分な大きさのコンテナーが見つかるまでビジュアルツリーを上に移動します。
これにより、ダイアログを実際に使用されている場所に近づけることができ、現在のアクティビティに関連するアプリの部分のみを暗くすることができます。ユーザーは、ダイアログを手動で押し出すことなく、アプリ内を移動することができます。モーダルダイアログは、異なるタブまたはサブビューで開きます。