2

モーダルWPFダイアログがメインアプリケーションウィンドウの背後に表示されることがあるアプリケーションに問題があります。これは、メインアプリケーションウィンドウでいくつかの処理を実行し、コントロールを(バインディングを介して)更新するダイアログのボタンをクリックすると発生します。バックグラウンドになると、アプリケーションの任意の場所をクリックすると、フォアグラウンドに戻ります。

        var dialog = LoadDialogWindowThroughMEF();
        dialog.Owner = Application.Current != null ? Application.Current.MainWindow : null;
        dialog.ShowInTaskbar = false;
        dialog.WindowStartupLocation = WindowStartupLocation.CenterOwner;
        return dialog.ShowDialog();

上記のコードは、モーダルウィンドウを開く方法を示しています。これはめったに起こりません。

何が問題になるのか誰か知っていますか?

4

1 に答える 1

2

答えられるかどうかわかりませんが、私の考えをいくつか共有できます。

この種の問題に遭遇するたびに、Ownerが正しく設定されていなかったことが原因でした。したがって、を設定しないOwnerようにして、問題が再現可能かどうかを確認します。Ownerが常に正しい親ウィンドウに設定されていることを完全に確認する必要があります1MainWindowまた、親になるはずのアプリケーションの実際のものであることを確認することもできます。ほとんどの場合、コードで明示的に2にすることは有益だと思います。この場合、これは、既知の親を割り当てる方がよいことを意味します (使用できる親への参照がどこかにある可能性があります)。Application.Currentその参照を提供します。そうすることで、 への割り当てを管理できるようになりますOwner?:単体テスト中でも参照を制御する手段があるため、演算子を取り除くことさえ可能になる可能性があります。

また、親ウィンドウを実際に更新しているコードが、親ウィンドウの特定のコントロールなどにフォーカスを強制しないようにしてください。(正しい親が に設定されている限り、Ownerこれが問題になる可能性はないと思います。)

これがお役に立てば幸いですが、そうでない場合は理解しています。親ウィンドウをクリックするとダイアログが再表示されるという事実は、私の主張の一部 (またはすべて!) を反証します...


1単体テストを実行する場合を除きますが、それはまったく別の問題です。

2 wiktionary.org/wiki/explicitによる単語の最初の意味のように、また暗黙的とは対照的に。

于 2012-12-29T14:40:31.577 に答える