在以下代码中,Form1
打开另外两个Form
,然后关闭其中一个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();
}
}
。结果是第二个子表单也被关闭了。为什么呢?
Form2
Form3
和{{1}}是默认的VS表单。
(另外:这是原始代码的简单版本。在原始版本中(当然,这里发布时间太长)从Visual Studio执行时不会发生这种情况(既不是调试也不是释放)。它只在安装为clickonce应用程序时才会发生,然后 - 即使我只是单击可执行文件(在AppData文件夹下)。(也许还有一些其他代码阻止它在那里发生时)从VS执行但我还没有找到什么。)导致这种差异的原因是什么?也许在Clickonce中某些类型的优化在常规发布模式下没有完成?)
答案 0 :(得分: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();
}
}
说明:当你没有传递父表单时,windows会使用这个方法将活动窗口作为父窗口:GetActiveWindow并且发生了什么:
当调用form2.showDialog()//父窗口是表单3时,因为GetActiveWindow获取正在显示的窗口并且form1不是活动或显示的方法
当您强制父母时: 当调用form2.showDialog(this)//父窗口是表单1,因为你定义了固定的