2012-11-17 48 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

我更新了答案,请检查它。 –

相关问题