2

驚くべきことに、Dispatcher に ShowDialog() 呼び出しを配置することで、一度に複数のダイアログを表示できます。

uiDispatcher.BeginInvoke(new Func<bool?>(myWindow.ShowDialog));

どうしてこれが機能し、ダイアログが表示されてもUIはユーザーの操作に応答して実行されたままになります(ShowDialog()がUIスレッドでなければならないスレッドをブロックするため、そうではないと思いました)、表示を続けることさえできます新しいダイアログ:

Window myWindow;
for(int i = 0; i < 5; i ++)
{
  myWindow = new Window(); 
  uiDispatcher.BeginInvoke(new Func<bool?>(myWindow.ShowDialog));
}

また、UI は引き続きレスポンシブです。

この動作に依存することに注意する必要がありますか? (バックグラウンドスレッドが必要なときに、あるダイアログを別のダイアログの上に表示したい-これは機能します-唯一の望ましくない動作は、アプリを切り替えるときにWPFがどのダイアログを一番上に置くべきかわからない場合があるようですが、それでも1つを表示できますダイアログの外側をクリックすることは通常許可されていないため、ダイアログでは珍しいことです)。

更新:私が遭遇した 1 つの問題は、ダイアログの 1 つを非表示にすると、ユーザーが他のすべての Windows と再びやり取りできることです! (他のダイアログだけではありません)。参照: WPF ダイアログがモーダルではありませんか?

4

1 に答える 1

4

ダイアログを表示しても UI スレッドはブロックされません。そうしないと、ダイアログを操作できなくなります。

未処理のモーダル ダイアログがあり、他のすべての非ダイアログ ウィンドウへの入力を無効にする必要があることを示すだけです。

ShowDialog 呼び出しをディスパッチャにシャッフすると、モーダル ダイアログが未処理のときに禁止されていること (他の非ダイアログ ウィンドウに入力すること) を行っていないため、ディスパッチャは追加のダイアログの作成を許可します。

新しいダイアログはダイアログであり、ダイアログ以外のウィンドウに入力しようとしていないため、完全に機能します。

アプリケーションを切り替えると、すべてのモーダル ダイアログが前面に表示されますが、複数のモーダル ダイアログがあるため、システムはどのモーダル ダイアログを一番上に配置するかについて混乱します。アクティブ化イベントをトラップし、必要なダイアログを手動で最前面に表示することをお勧めします。

于 2011-03-11T06:48:31.150 に答える