2011-11-11 45 views
2

我有兩個打開的winform,說winform1得到一個模態對話框,這意味着所有的窗體(winform1和winform2)都將被「禁用」。如果我們最小化所有表單,然後調出winform1,那麼模態對話框將顯示在它上面。如果我們再次最小化所有表單,但是這次會調出winform2,它看起來像finform2已準備好使用,而它的真正禁用像winform1。兩個winforms一個模態對話框的情況

我需要的是清楚地表明在使用winform2之前需要處理模態對話框。

有什麼內置的來處理這個問題還是我自己在這裏?

+0

這是可能的,但棘手。是你創建的模式對話框(例如'modalForm = new Form();'),還是它可以是一個'MessageBox'? –

+0

modalForm是一個常規創建的winform(modalForm = newForm();) – Banshee

+0

好吧,我發佈了一個基於此的答案。 (對於MessageBox,它可能不起作用)。 –

回答

2

在你winform2.Activated事件處理程序,調用此:

static void FocusModalForm() 
    { 
     foreach (Form form in Application.OpenForms) 
      if (form.Modal) 
      { 
       form.WindowState = FormWindowState.Normal; 
       form.BringToFront(); 
      } 
    } 

例如

Form f2 = new Form(); 
    f2.Activated += (_, __) => FocusModalForm(); 
    f2.Show(); 

你可能需要做同樣的事情winform1Activated事件。這取決於如何創建winform2。只要嘗試一下,如果您發現winform1(或任何其他非模態形式)仍然能夠在模態表單前面找到,請從Activated事件中調用FocusModalForm()。我試圖隱藏所有的窗口(點擊任務欄上的顯示桌面按鈕),然後直接從任務欄中選擇form2,我也嘗試在任務欄中選擇form2而不隱藏所有窗口。 Form3始終保持在最佳狀態。

+0

我試過了,它看起來不錯。然而,我並沒有使用靜態方法,而是使用了一個常規方法,但是如果要爲多個表單使用靜態方法,我會看到這一點。我徘徊沒有試過如何定期的消息框將工作。非常感謝! – Banshee

+0

如果使用常規的MessageBox.Show,則此解決方案不起作用。 – Banshee

+0

@SnowJim:我知道,這就是爲什麼我問你如何創建表單。如果你想讓它與MessageBox.Show ....一起工作,還有更多的工作要做。 (換句話說,我不知道爲什麼它不起作用):) –

0

我有一個類似的應用程序(vb.net),其中win1調用win2 & win2顯示win3,它的工作原理如你所願,但勝2 & 3都是模態。我不知道這是爲什麼它可行。也許這對你來說是一種選擇?

+0

但是,當win3中沒有模態對話框時,應該很容易切換到win1和win2。所以這些不能設置爲模態。 – Banshee

0

如果你這樣做:

var winform2 = new Winform2(); 
winform2.Show(winform1); 

然後winform2將始終高於winform1被顯示,但它不會是模式。可能是這可以幫助你。

+0

這將嘗試打開winform1作爲winform2的模式對話框,這不是我想要的。 – Banshee

+0

@SnowJim:不,這會打開winform2(已經打開)winform1作爲所有者。這意味着winform2將始終顯示在winform1之前。當winform1最小化時,winform2會自動隱藏,直到winform1恢復。而且,當winform1關閉時,winform2也會自動關閉。 –

相關問題