2012-06-11 43 views
1

我正在C#WPF .NET 3.5中開發應用程序。我有一個主窗口M,從中我打開一個未使用Window.Show()方法設置Owner屬性的非模態子窗口C1。從C1窗口創建另一個子窗口C2。從C2我創建另一個子窗口C3。 C2和C3都是無模式的,使用Window.Show()方法創建並且沒有設置Owner屬性。下面是Windows的序列:單擊父對話框時將無模式子對話框置於頂端

米 - > C1 - > C2 - > C3

我想如下的窗口行爲。如果點擊C1,並且C2打開,則C2被置於頂端。如果C2達到最高點,或者C2點擊,並且C3打開,則C3達到最高點。如果M被點擊,則M應該到達頂部。因此,C1,C2和C3的行爲將類似於模態窗口。不過,我不希望C1,C2和C3實際上是模態的,即我不想使用擁有Owner屬性集的Window.ShowDialog()方法創建它們。這是因爲我希望用戶能夠在需要時進入主窗口M.我如何實現這種行爲?

我事先感謝您的幫助。

geekowl

更新:

我加GotFocus事件處理程序中按建議的父窗口,但GotFocus事件不會被解僱。所以我添加了激活事件處理程序,並在此子窗口的名爲Activate()的處理程序中。這幾乎解決了這個問題,但在某些情況下,這種方法並不完美。例如,當孩子最小化並且父母被點擊時,孩子被激活,但孩子不會自動最大化。我試圖使用其他方法而不是使用Activate(),但他們都沒有給出完美的解決方案。最終,我使用該方法在顯示子窗口後隱藏父窗口,並在子關閉時再次顯示父窗口。

回答

2

如果您的窗口都使用Control.Focus()方法引用了對方,則應該可以執行此操作。

你會添加一個事件處理程序到C1,當它被點擊時會調用C2.Focus()。你可以用C2來調用C3.Focus()。

根據我從你的問題中收集的內容,我認爲你最好的事件是添加一個處理程序,在你的C1和C2窗口中將是GotFocus事件。基本上,只要他們「獲得焦點」,就會檢查他們的子窗口是否打開,然後在子窗口上調用Focus()。這會在該窗口觸發GotFocus(所以如果你的用戶點擊C1,它會將C2帶到頂端,然後將C3帶到頂端)。

+0

非常感謝。我可以使用哪個事件監聽器? – geekowl

+0

更新了上述內容以包含我推薦使用的事件處理程序。 –

+0

我已經更新了我的問題。感謝您提供建議。他們非常有幫助。他們幫助我找到了正確的解決方案。我非常感謝你的幫助。 – geekowl