关闭一个儿童形式关闭其他儿童形式

isp*_*iro 4 .net c# winforms

在下面的代码中,Form1打开另外两个Forms,然后关闭其中一个.结果是第二个子表单也被关闭了.为什么?

public partial class Form1 : Form
{
    System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer { Interval = 2000 };

    public Form1()
    {
        InitializeComponent();
        ShowForm3();
        (new Form2()).ShowDialog();//If this is changed to 'Show' - it doesn't get closed.
    }

    void ShowForm3()
    {
        Form3 f3 = new Form3();
        f3.Show();
        timer.Tick += (sender, e) => f3.Close();
        timer.Start();
    }
}
Run Code Online (Sandbox Code Playgroud)

Form2并且Form3是默认的VS Forms.

(另外:这是原始代码的一个简单版本.在原始版本中(当然,这里发布的时间太长)从Visual Studio执行时不会发生这种情况(既不是Debug也不是Release).它只发生在作为clickonce应用程序安装,然后 - 即使我只是单击可执行文件(在AppData文件夹下).(也许还有一些其他代码阻止它从VS执行时发生但我还没有找到什么然而.)导致这种差异的原因是什么?也许某些类型的clickonce优化在常规发布模式下没有完成?)

ren*_*fc3 5

将您的代码更改为可行的代码:

  public partial class Form1 : Form
  {
    System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer { Interval = 2000 };

    public Form1()
    {
        InitializeComponent();
        ShowForm3();
        (new Form2()).ShowDialog(this);
    }

    void ShowForm3()
    {
        Form3 f3 = new Form3();
        f3.Show();
        timer.Tick += (sender, e) => f3.Close();
        timer.Start();
    }
  }
Run Code Online (Sandbox Code Playgroud)

解释:当你没有传递父表单时,windows会使用这个方法将活动窗口作为父窗口:GetActiveWindow和发生的事情是:

当调用form2.showDialog()//父窗口是表单3时因为GetActiveWindow获取正在显示的窗口的方法而且form1不是活动的或显示的

当你强制父:当调用form2.showDialog(this)时//父窗口是1,因为你定义了固定