1

C# WPF .NET 3.5 でアプリケーションを開発しています。メイン ウィンドウ M があり、そこから Window.Show() メソッドを使用して設定されていない Owner プロパティを持つモードレス子ウィンドウ C1 を開きます。C1 ウィンドウから、別の子ウィンドウ C2 を作成します。C2 から別の子ウィンドウ C3 を作成します。C2 と C3 はどちらもモードレスで、Window.Show() メソッドで作成され、Owner プロパティが設定されていません。以下は、一連のウィンドウです。

M -> C1 -> C2 -> C3

次のようなウィンドウの動作が必要です。C1 をクリックし、C2 が開いている場合、C2 が最前面に表示されます。C2 が最前面に移動するか、C2 をクリックして C3 が開いている場合、C3 が最前面に移動します。M をクリックすると、M が一番上に来るはずです。したがって、C1、C2、および C3 はモーダル ウィンドウのように動作します。ただし、C1、C2、および C3 を実際にモーダルにしたくありません。つまり、Owner プロパティが設定された Window.ShowDialog() メソッドで作成したくありません。これは、ユーザーが必要に応じてメイン ウィンドウ M に移動できるようにするためです。どうすればこの動作を実現できますか?

よろしくお願いします。

ギークウル

アップデート:

提案に従って、親ウィンドウに GotFocus イベント ハンドラーを追加しましたが、GotFocus イベントは発生しません。そこで、Activated イベント ハンドラーを追加し、このハンドラーで子ウィンドウの Activate() を呼び出しました。これで問題はほぼ解決しましたが、特定の条件下では、このアプローチは完全には機能しません。たとえば、子が最小化され、親がクリックされると、子はアクティブになりますが、子は自動的に最大化されません。Activate() を使用する代わりに、他の方法を使用して子をトップにしようとしましたが、完璧な解決策はありませんでした。最終的に、子ウィンドウを表示した後に親ウィンドウを非表示にし、子ウィンドウを閉じたときに親ウィンドウを再度表示する方法を使用しました。

4

1 に答える 1

2

Control.Focus()メソッドを使用してすべてのウィンドウが相互に参照している場合、これを実行できるはずです。

クリックされたときに C2.Focus() を呼び出すイベント ハンドラーを C1 に追加します。C3.Focus() を呼び出す C2 で同じことを行います。

あなたの質問から集めたものに基づいて、ハンドラーを追加するのに最適なイベントは、C1 および C2 ウィンドウのGotFocusイベントになると思います。基本的に、「フォーカスを得る」たびに、子ウィンドウが開いているかどうかを確認してから、子ウィンドウで Focus() を呼び出します。これにより、そのウィンドウで GotFocus がトリガーされます (したがって、ユーザーが C1 をクリックすると、C2 が一番上に表示され、次に C3 が一番上に表示されます)。

于 2012-06-11T13:00:49.980 に答える