2012-06-30 45 views
0

我主要form.I使用form2.ShowDialog(Application.OpenForms["MainForm"]); 然後我調用從Form2的另一種形式掠影顯示新的表單時顯示

this.Hide(); 
    form3.ShowDialog(Application.OpenForms["MainForm"]); 
    this.Dispose(); 

一切工作正常,但是當一個form3顯示我從MainForm中調用窗口2可以看到背景中顯示的任何窗口,例如:如果我已經打開MS油漆將其放置在背景中,「油漆」窗口將在我的窗口上方停留時間小於一秒,然後自動進入背景。 這是怎麼回事?我該如何糾正它?

回答

1

當您撥打this.Hide()時,Form2被隱藏,另一個窗口需要專注。但是,您使用ShowDialog打開了Form2,這意味着Form2是唯一可以在您的應用程序中專注的窗口。但是,既然你隱藏了Form2,Windows就會找到另一個窗口來關注它(在這種情況下,MS Paint)。一個解決方案

一個建議可能是隱藏窗體2之前,人爲地給MainForm的重點:

Application.OpenForms["MainForm"].Activate(); 
this.Hide(); 
form3.ShowDialog(Application.OpenForms["MainForm"]); 
this.Dispose(); 

也許更漂亮的解決辦法是先打開Form3,等待要顯示它,然後隱藏窗體2 。要做到這一點,放在Form2的這段代碼,當你想顯示Form3:

form3.Shown += (_s, _e) => Application.OpenForms["Form2"].Hide(); 
form3.ShowDialog(Application.OpenForms["MainForm"]); 
this.Dispose(); 
+0

感謝第一個解決方案的工作。 – techno

1

嗯,你是顯示的對話框讓您明明白白會第二看到一個分裂的另一個窗口前隱藏你的主窗口,取其在它後面。你所做的事情也是非常危險的,你的程序失去焦點的可能性非常高。在顯示對話框之前和特別是之後,您的程序將沒有可以接收焦點的窗口。所以Windows窗口管理器被迫找到另一個窗口來關注它,它會選擇另一個應用程序的窗口。強迫你的背景,如果窗口足夠大,讓它完全消失。

您需要採取相應措施。您可以通過延遲Hide()調用隱藏主窗口,表單的BeginInvoke()方法非常方便。你需要確保你的主窗口在對話框關閉之前再次可見。對話框的FormClosing事件對此很有幫助。儘管如果對話框已經連線事件而不是覆蓋OnFormClosing(),那麼並非100%可靠。

這樣:

private void DisplayDialog_Click(object sender, EventArgs e) { 
     using (var dlg = new Form2()) { 
      this.BeginInvoke(new Action(() => this.Hide())); 
      dlg.FormClosing += dlg_FormClosing; 
      dlg.StartPosition = FormStartPosition.Manual; 
      dlg.Location = this.Location; 
      if (dlg.ShowDialog() == DialogResult.OK) { 
       // etc.. 
      } 
      dlg.FormClosing -= dlg_FormClosing; 
     } 
    } 

    void dlg_FormClosing(object sender, FormClosingEventArgs e) { 
     if (!e.Cancel) this.Show(); 
    } 

或者只是不隱藏自己的主窗口。這不是非常有用,對話框現在非常令人討厭,是模態並防止任何複製/粘貼。防止用戶完全看到窗口只是隱藏了可能對用戶有用的信息。