簡體   English   中英

3個表格Show和ShowDialog不能按預期工作,BUG?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM