2010-09-18 45 views
1

我正在使用Visual Studio 2010,C#.NET 4.0。我有3種形式:Form1,Form2,Form3。3種形式Show and ShowDialog不能按預期工作,BUG?

在Form1我有一個按鈕,打開窗體2:

private void button1_Click(object sender, EventArgs e) 
{ 
    Form2 f = new Form2(); 
    f.Show(); 
} 

在窗體2我有一個私人Form3變量總是指向同一個Form3:

private Form3 f = new Form3(); 

和一個按鈕來打開它一個對話框:

private void button1_Click(object sender, EventArgs e) 
{ 
    f.ShowDialog(); 
} 

在Form3中我只是有一個按鈕來隱藏窗體:

private void button1_Click(object sender, EventArgs e) 
{ 
    this.Hide(); 
} 

的問題是,其在窗體2,前當我點擊按鈕的Form3隱藏它是Form2的是在Form1的前面的情況,和Form3,它不僅隱藏本身,而是向Form1中的所有其他Windows的後面。

這隻發生在Form1的背景中有另一個程序(例如Windows資源管理器)的窗口時。這看起來像一個錯誤。你怎麼看?

+0

因爲我知道這是一個已知的錯誤。我們找不到一個解決方案,並在它的約2年生活(((( – 2010-09-18 17:58:56

回答

4

是的,這不能通過設計正常工作。對話框會禁用程序顯示的所有窗口。所以這是模態。當你隱藏對話框時,沒有可以獲得焦點的窗口。 Windows被迫尋找另一個窗口來重點關注。這將是另一個應用程序擁有的窗口。你自己的窗戶現在隱藏在它後面。

還有更多的副作用,對話框也將關閉。必要的,因爲否則用戶將無法再回到您的程序,因爲所有窗口都被禁用。這一切都是不奇怪的行爲。 Bug會是一個很強的詞,但如果它在關閉對話框之前首先重新啓用所有窗口,它當然會更好。但關閉對話框已經是不受歡迎的行爲。

不要調用Hide()作爲對話框。只需將DialogResult屬性設置爲DialogResult.Cancel即可達到完全相同的效果,減去焦點問題。如果要再次顯示對話框,則必須將其重置爲無。這是一個真正的錯誤。

+0

非常感謝你回答。但對我來說,對話框不關閉。當hidding,它將控制返回到所有者窗體(在ShowDialog調用後),但我可以做另一個ShowDialog調用沒有問題,並且對話框形式被恢復到相同的狀態,所以它沒有關閉。 – cprcrack 2010-09-18 18:12:47

+0

哦,好吧,關閉不涉及配置,所以表單狀態被保存,表單確實關閉,但我可以再次打開它。我的錯。 – cprcrack 2010-09-18 18:16:55

+0

這很正確。這裏的「關閉」意味着窗口關閉,表單對象仍然活着,因爲它沒有被處置。並允許用ShowDialog重新創建窗口。 – 2010-09-18 18:25:25

1

通過文檔。 Form.Close method未配置Form.ShowDialog方法所示的表單。報價:

當一個窗體不處理關閉時的兩個條件是:(1)它是多文檔界面(MDI)應用程序的一部分,並且窗體不可見;和(2)你使用ShowDialog顯示了表單。在這些情況下,您需要手動調用Dispose來標記垃圾收集的所有表單控件。

因此,也許有辦法將焦點返回給您的應用程序(例如通過Windows API)。但在對話框窗口中手動調用Form.Close要方便得多。