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

cpr*_*ack 1 .net c# forms visual-studio winforms

我使用的是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();
}
Run Code Online (Sandbox Code Playgroud)

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

private Form3 f = new Form3();
Run Code Online (Sandbox Code Playgroud)

还有一个按钮可以将其作为对话框打开:

private void button1_Click(object sender, EventArgs e)
{
    f.ShowDialog();
}
Run Code Online (Sandbox Code Playgroud)

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

private void button1_Click(object sender, EventArgs e)
{
    this.Hide();
}
Run Code Online (Sandbox Code Playgroud)

问题是,Form2位于Form1前面,而Form3位于Form2前面,当我单击Form3的按钮隐藏它时,它不仅隐藏自身,而且将Form1发送到所有其他Windows的后面.

仅当Form1的背景中存在另一个程序(例如Windows资源管理器)的窗口时才会发生这种情况.这似乎是个bug.你怎么看?

Han*_*ant 5

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

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

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