我试图理解WinForms应用程序中以下代码的行为 我有两种形式 - Form1和Form2。当我从Form2中关闭Form1时,甚至Form2也会关闭。我确保它们都将Owner属性设置为null。
有人可以解释为什么Form2也会从下面的代码中关闭吗? Form1:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}
Form2:
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上的Button时,Form1和Form2都会关闭。我还确保该按钮不是Form2的okbutton或cancelbutton。任何人都可以解释为什么会这样吗?
答案 0 :(得分:1)
Form1关闭是因为您创建了一个新的Form1并将其传递给Form2,而在Form2中,您正在关闭Form1。并且因为Form2是一个DialogForm,并在Form1之后创建,它被认为是Form1的DialogForm,所以如果Form1关闭,DialogForm也会关闭。这是一种预期的行为,而不是一种古怪的行为。
使用
显示它f2.Show();
或在MainForm中显示Form2对话框表单(通过MainForm将f1传递给Form2),因此Form1关闭但不是Form2。
更新
在Program.cs中尝试此操作,您将看到在关闭Form1后应用程序的MainWindow已关闭。
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());