BUG?3表单Show和ShowDialog没有按预期工作?

时间:2010-09-18 17:56:37

标签: c# .net visual-studio winforms forms

我使用的是Visual Studio 2010,C#.NET 4.0。我有3种形式:Form1,Form2,Form3。

在Form1中,我有一个用于打开Form2的按钮:

private void button1_Click(object sender, EventArgs e)
{
    Form2 f = new Form2();
    f.Show();
}

在Form2中,我有一个私有Form3变量,始终指向相同的Form3:

private Form3 f = new Form3();

按一个按钮将其打开为对话框:

private void button1_Click(object sender, EventArgs e)
{
    f.ShowDialog();
}

在Form3中,我只有一个按钮来隐藏表单:

private void button1_Click(object sender, EventArgs e)
{
    this.Hide();
}

问题是Form2在Form1前面,Form3在Form2前面,当我单击Form3的按钮隐藏它时,它不仅隐藏自己,而且将Form1发送到所有的后面另一个Windows。

只有在Form1背景中有另一个程序(如Windows资源管理器)的窗口时才会发生这种情况。这似乎是个bug。你觉得怎么样?

2 个答案:

答案 0 :(得分:5)

是的,这在设计上无法正常工作。一个对话框禁用程序显示的所有窗口。所以它是模态的。隐藏对话框时,没有可以获得焦点的窗口。 Windows被迫找到另一个窗口来关注。这将是另一个应用程序拥有的窗口。你自己的窗户现在会隐藏在它后面。

还有更多的副作用,对话框也会关闭。必要,因为否则用户永远不会再回到您的程序,因为所有窗口都被禁用。这都是不足为奇的行为。 Bug将是一个强有力的词,但如果它在关闭对话框之前首先重新启用所有窗口,它当然会更好。但关闭对话框已经是不受欢迎的行为。

不要为对话框调用Hide()。只需将DialogResult属性设置为DialogResult.Cancel即可实现完全相同的效果,减去焦点问题。如果要再次显示对话框,则必须将其重置为“无”。这是一个真正的错误。

答案 1 :(得分:1)

通过文档。 Form.Close method不会处理Form.ShowDialog方法显示的表单。引用:

  

表单未在Close上处理时的两个条件是(1)它是多文档界面(MDI)应用程序的一部分,并且表单不可见; (2)您使用ShowDialog显示了表单。在这些情况下,您需要手动调用Dispose以标记所有表单的垃圾收集控件。

因此,可能有一些方法可以将焦点返回到您的应用程序(例如,通过Windows API)。但是在对话框窗口上手动调用Form.Close会更方便。