2009-01-03 74 views

回答

5

長話短說:只要模態窗口打開,打開模態窗體就會在主窗體上執行塊,所以您的主窗體無法檢查它是否打開任何模態窗體直到模態窗體關閉。換句話說,你的問題是基於對模態形式如何工作的誤解,所以它完全沒有意義。

爲了什麼它的價值,它是可能告訴如果有任何模式的形式開放:

foreach (Form f in Application.OpenForms) 
{ 
    if (f.Modal) 
    { 
     // do stuff 
    } 
} 
+9

這其實並非如此。如果它是真的,那麼每當你移動一個文件打開對話框時,它將不能重畫。所以至少繪畫會運行。一旦繪畫運行,你可以做任何事情。有幾個窗口消息通過並允許代碼執行 – JaredPar 2009-01-04 00:17:14

+3

同意JaredPar,這是一個明智的問題。例如,如果您在調用之前檢查另一個線程,以顯示新的對話框,該怎麼辦? 儘管如此,代碼示例看起來不錯。 – John 2009-10-06 11:01:51

+2

不幸的是,這段代碼沒有檢測到模態消息框(例如,當使用MessageBox.Show時)。 – 2011-08-24 21:25:52

30
if (this.Visible && !this.CanFocus) 
{ 
    // modal child windows are open 
} 
5

您也許可以使用EnterThreadModalLeaveThreadModal的事件。下面是一個例子,你可以做到這一點:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    static class Program 
    { 
     [STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 

      Application.EnterThreadModal += new EventHandler(Application_EnterThreadModal); 
      Application.LeaveThreadModal += new EventHandler(Application_LeaveThreadModal); 

      Application.Run(new Form1()); 
     } 

     private static void Application_EnterThreadModal(object sender, EventArgs e) 
     { 
      IsModalDialogOpen = true; 
     } 

     private static void Application_LeaveThreadModal(object sender, EventArgs e) 
     { 
      IsModalDialogOpen = false; 
     } 

     public static bool IsModalDialogOpen { get; private set; } 
    } 
} 
0

定時器仍然運行並引發事件。 舉例說明... public partial class Form1:Form { Form2 f2 = new Form2(); public Form1() { InitializeComponent(); }

private void timer1_Tick(object sender, EventArgs e) 
    { 
     f2.UpdateData(DateTime.Now.ToString()); 
     if (!f2.Visible) f2.ShowDialog(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     f2.ShowDialog(); 
     MessageBox.Show("Done"); 
    } 
} 
0

如果你google了一下,你會發現,Form.ShowDialog()禁止其他形式的,以防止用戶輸入這些形式在當前的一個。但是大多數其他事情(如定時器和來自顯示錶單外部的其他事件)繼續運行。

相關問題