![](/img/trans.png)
[英]Windows Forms: UI threads flow with Show() and ShowDialog()
[英]3 forms Show and ShowDialog not working as expected, BUG?
我正在使用Visual Studio 2010,C#.NET 4.0。 我有3種形式:Form1,Form2,Form3。
在Form1中,我有一個打開Form2的按鈕:
private void button1_Click(object sender, EventArgs e)
{
Form2 f = new Form2();
f.Show();
}
在Form2中,我有一個私有的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();
}
問題是,當Form2在Form1前面,而Form3在Form2前面時,當我單擊Form3的按鈕將其隱藏時,它不僅隱藏自身,還將Form1發送到所有其他Windows的后面。
僅當Form1的后台有另一個程序的窗口(例如Windows資源管理器)時,才會發生這種情況。 好像是個錯誤。 你怎么看?
是的,這在設計上無法正常工作。 對話框將禁用程序顯示的所有窗口。 因此它是模態的。 隱藏對話框時,沒有剩余的窗口可以獲取焦點。 Windows被迫找到另一個要關注的窗口。 那將是另一個應用程序擁有的窗口。 您自己的窗口現在將隱藏在其后面。
有更多的副作用,對話框也會關閉。 這是必要的,因為否則,由於所有窗口均被禁用,用戶再也無法返回到您的程序了。 這都是毫不奇怪的行為。 Bug是個好詞,但如果在關閉對話框之前先重新啟用所有窗口,則它當然會更好。 但是關閉對話框已經是不受歡迎的行為。
不要為對話框調用Hide()。 只需將DialogResult屬性設置為DialogResult.Cancel即可獲得與聚焦問題完全相同的效果。 如果要再次顯示該對話框,則必須將其重置為“無”。 那是一個真正的錯誤。
通過文檔。 Form.Close方法不處理由Form.ShowDialog方法顯示的表單。 引用:
表單未放置在“關閉”上的兩個條件是:(1)它是多文檔界面(MDI)應用程序的一部分,並且該表單不可見; (2)您已使用ShowDialog顯示了表單。 在這些情況下,您將需要手動調用Dispose來標記表單的所有控件以進行垃圾收集。
因此,也許有辦法將焦點返回到您的應用程序(例如,通過Windows API)。 但是調用Form更為方便。在對話框窗口上手動關閉 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.