追加のウィンドウなしで埋め込みダイアログを使用する場合は、PrismのRegionManagerを使用してアウトライン化された動作を実現できます。秘訣は、ポップアップ領域をビジュアルツリーのメイン領域と平行に配置することです。
<Grid>
<ContentControl cal:RegionManager.RegionName="MainRegion" IsEnabled={Binding IsNoPopUpActive} />
<ContentControl cal:RegionManager.RegionName="PopUpRegion"/>
</Grid>
次に、RegionManagerを使用して、ビュー「A」を「MainRegion」に配置します。IPopUpDialogControllerと同様のコントローラークラスを作成します。ビュー「B」(またはアプリケーション内の他のPopUpView)をオンデマンドで「PopUpRegion」に配置する責任があります。さらに、基になる「MainRegion」を有効または無効にするように通知するフラグを制御する必要があります。このように、ポップアップが閉じられるまで、ユーザーはビュー「A」のコントロールで遊ぶことができません。
これは、フレームをDispatcherにプッシュする前に、ComponentDispatcher.PushModal()を使用してモーダル方式で実行することもできます。ただし、モーダルダイアログは避けることをお勧めします。
更新:コメントで要求されたように、IsNoPopUpActiveはバッキングビューモデルに実装できます。そこで、ポップアップ領域のRegionManagerのViewコレクションにリンクできます。
public bool IsNoPopUpActive
{
get { return _regionManager.Regions["PopUpRegion"].Views.Count() == 0; }
}
ビューコレクションを変更(ポップアップを追加/削除)するとすぐに、PropertyChangedイベントをトリガーすることを忘れないでください。
参考までに:最近は、バックグラウンドでコントロールを無効にすることを避け、代わりに透明なパネルを挿入しています。これにより、バックグラウンドコントロールをクリックする必要がなくなります。ただし、これはキーボード入力(コントロールへのタブ入力)を処理しません。キーボード入力を修正するには、キーボードフォーカスがポップアップにトラップされていることを確認する必要があります( WPFフォーカスの概念に関するMSDN)。
次のフォーカス属性をポップアップ領域に追加すると、うまくいくはずです。
KeyboardNavigation.DirectionalNavigation="None"
KeyboardNavigation.ControlTabNavigation="None"
KeyboardNavigation.TabNavigation="Cycle"
KeyboardNavigation.TabIndex="-1"