2013-01-31 195 views
2

我有一個主窗體,它打開窗體A,從窗體AI可以打開窗體B,從窗體BI可以打開窗體C.問題是如果我打開窗體B,一切正常很好,但如果我也打開表單C,然後關閉表單C和B,表單A就會落後於主表單。對於形狀餘米只是創造形式的實例,然後使用.Show()在c中失去焦點#

cNewForm form = new cNewForm(); 
form.Show(); 

我在做這爲每個表單

+0

'形式擁有C型.Focus()'? –

+0

這是你的意圖,顯示窗體無模式(所以你可以隨時訪問任何形式)?或者你是否打算按照你所描述的方式堆疊它們?如果你打算把它們堆疊起來(在表單C關閉之前不能使用表單B等等),那麼你可以嘗試使用.ShowDialog()來代替。 –

+0

您可以使用BringToFront方法來解決您的問題。是否設置了TopMost屬性的主窗口? – gustavodidomenico

回答

2

,因爲你正在使用的Show()無參數版本,您沒有設置窗口所有權正確。您需要通過調用接收所有者參數的Show()重載來設置所有者。或者,您可以直接設置Owner屬性,但在撥打Show()時,更好。

窗口所有者是一個重要的Win32概念。我建議閱讀關於這個主題的MSDN documentation

  • 一個擁有的窗口始終位於其所有者的z順序之上。
  • 系統在其擁有者被銷燬時自動銷燬擁有的窗口。
  • 擁有窗口在其所有者最小化時隱藏。

在你的情況我想你想形式的由主窗體所擁有,形狀B由形式的擁有,並通過形式B.

+0

實際上問題是通過將Form Border Style設置爲Sizable來解決的,任何人都知道爲什麼? – user2029200

+0

可能是因爲導致重新創建窗口句柄並且所有者設置正確。你描述的行爲肯定是由不正確的所有者。注意要點1.如果所有者設置正確,您的報告行爲不會發生。 –

0

嘗試使用ShowDialog();梅索德代替show(),以顯示它作爲模態形式。請參見documentation

+0

大概選擇了Show是因爲該設計的形式是無模式的。 –

1

我經常發現通過將所有者分配給Windows可以解決這些類型的問題。當顯示窗口:

FormA formA = new FormA(); 
formA.Show(this); // assuming this code is in the main form