2013-03-03 27 views
0

我有兩種形式。第一個是父,並且包含所述第二和一個按鈕的引用:使用顯示和隱藏兩種形式之間的過渡不會像我預期的那樣表現

public class Form1:Form { 

     private Form2 frm2; 
     private Button btnShow; 
... 

} 

當我按下按鈕FRM2必須顯示(可見和在所有其他窗口的前面)和Form1中必須隱藏。

當我按下frm2的關閉框時,frm2必須隱藏並且必須顯示Form1(反向)。

我用btnShow的click事件註冊一個句柄,它所做的是:

private void click(object sender, EventArgs e) 
    { 
     Hide(); 
     frm2.Show(this); 
    } 

和FRM2的的FormClosing事件:

private void byebye(object sender, FormClosingEventArgs e) 
    { 
     if (e.CloseReason == CloseReason.UserClosing) 
     { 
      e.Cancel = true; 
      Hide(); 
      Owner.Show(); 
     } 
    } 

我的代碼工程的90%時間,但有時(我不能指定何時)所示的形式 沒有被帶到前面或失去焦點(我不知道我認爲第一個)。

我在做什麼錯。我試過交替顯示的順序,隱藏和使用的新的參考,而不是老闆,我也用激活,BringToFront,焦點,但沒有成功...

+0

如果您不介意您的父窗體在後臺可見,則可以使用ShowDialog代替,這是正常行爲。 – nvoigt 2013-03-03 16:43:05

回答

1
Hide(); 
    Owner.Show(); 

你正在做這個錯誤的方法。瞬間,應用程序中沒有可以獲得焦點的單個窗口。 Windows窗口管理器被迫找到另一個窗口來關注焦點。這將是另一個應用程序的窗口。有很大的可能性,這是一個足夠大的窗口來覆蓋你自己的。您的Show()調用將使您的窗口再次顯示,但現在位於移動到前臺的窗口下方。這並不總是偶然發生,窗口管理器似乎使用一個小超時。所有者被隱藏的時間越長,其代碼被換出的可能性就越大,並且顯示它的花費更多時間,從而導致超時。

解決方法很簡單,只需交換兩個語句,以便始終擁有可以專注的窗口。修復:

Owner.Show(); 
    Hide(); 
+0

我認爲這是訣竅。事情是我不知道導致問題是非常罕見的。我會再測試一下,然後我會接受這個作爲正確的安納塞爾。 – Blim 2013-03-03 18:00:15

2

爲什麼不乾脆:

{ 
    Form2 fm = new Form2(); 
    this.Visible = false; 
    fm.ShowDialog(); 
    this.Visible = true; 
} 

適合我。

+0

這種方法患有*確切*相同的問題。 – 2013-03-03 17:06:11

相關問題