2012-11-17 50 views
0

我想了解下面的代碼在WinForms應用程序中的行爲。
我有兩種形式 - Form1和Form2。當我從Form2中關閉Form1時,即使Form2也被關閉。我已確保它們都將Owner屬性設置爲null。Winforms中關閉一個不相關的.NET窗體內的另一種形式

任何人都可以解釋爲什麼Form2會從下面的代碼中關閉嗎?
Form1中:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 
} 

窗體2:

public partial class Form2 : Form 
{ 
    Form1 f1; 
    public Form2(Form1 f1) 
    { 
     InitializeComponent(); 
     this.f1 = f1; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    {   
     f1.Close();   
    } 
} 

的Program.cs

static void Main() 
    {   
     Form1 f1 = new Form1(); 
     f1.Size = new Size(0, 0); 
     f1.Show();   

     Form2 f2 = new Form2(f1); 
     f2.ShowDialog();    

     Application.Run(new MainForm()); 
    } 

當Form2上的按鈕被點擊這兩個Form 1和Form關閉掉。我也確保該按鈕不是Form2的okbutton或cancelbutton。誰能解釋爲什麼會發生這種情況?

+0

MainForm()是什麼意思?刪除行_f1.Show(); _並替換Application.Run(f1); –

+0

MainForm是一個無關的表單,以標準方式啓動應用程序。我感興趣的是在調用Application.Run()之前爲什麼這兩個表單行爲如此。如果Form2在Application.Run()中調用,那麼行爲是按照我們的期望 – Rhino

+0

然後,將這些窗體顯示代碼移動到MainForm_Load –

回答

1

Form1因爲您創建了一個新的Form1並將其傳遞給Form2,並在Form2內部關閉了Form1而關閉。只是因爲Form2是一個DialogForm,並且在Form1之後創建,所以它應該是Form1的DialogForm,所以如果Form1關閉,DialogForm也會關閉。這是一個預期的行爲,而不是一個古怪的行爲。

要麼顯示它使用

f2.Show(); 

或顯示內的MainForm的窗體2對話形式(通過經由MainForm的傳遞f1到窗體2),所以Form1中關閉但不是窗體2。

更新:

在你的Program.cs試試這個,你會看到該應用程序的主窗口關閉後,您關閉Form1後。

Form1 f1 = new Form1(); 
f1.Size = new Size(0, 0); 
f1.Show(); 

MessageBox.Show(System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle.ToString()); 

Form f2 = new Form2(f1); 

MessageBox.Show(System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle.ToString()); 

f2.ShowDialog(); 

MessageBox.Show(System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle.ToString()); 

Application.Run(new MainForm()); 
+0

謝謝你的解釋。你知道爲什麼這發生在Application.Run之前,而不是之後?即爲什麼Form2考慮Form1的DialogForm?我們如何檢查這個?有沒有可以讓我們檢查的財產?再次感謝您的回答。 – Rhino

+0

由於Form1和ShowDialog不能無模式化(afaik),所以Form1將成爲應用程序的MainWindow,因爲它是首先調用的,並且如果您的主窗口已關閉,Form2也會關閉。 –

+0

我更新了答案,請檢查它。 –

相關問題