0

我试图了解 WinForms 应用程序中以下代码的行为。
我有两个表格 - Form1 和 Form2。当我从 Form2 内部关闭 Form1 时,即使 Form2 也会关闭。我确保他们都将 Owner 属性设置为 null。

谁能从下面的代码中解释为什么 Form2 也会被关闭?
表格1:

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();         
    }
}

程序.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 上的按钮时,Form1 和 Form2 都会关闭。我还确保该按钮不是 Form2 的确定按钮或取消按钮。谁能解释为什么会这样?

4

1 回答 1

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());
于 2012-11-17T12:16:23.867 回答