我正在使用 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 中,我有一个私有(private)的 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发送到所有Form的后面其他窗口。
只有当 Form1 的后台有另一个程序(如 Windows Explorer)的窗口时才会出现这种情况。这似乎是一个错误。你怎么看?
最佳答案
是的,这在设计上无法正常工作。对话框会禁用您的程序显示的所有窗口。所以它是模态的。当您隐藏对话框时,没有留下可以获取焦点的窗口。 Windows 被迫寻找另一个窗口以提供焦点。那将是另一个应用程序拥有的窗口。您自己的窗口现在将隐藏在它后面。
副作用比较多,对话框也会关闭。必要的,因为否则用户将永远无法返回到您的程序,因为所有窗口都被禁用。这都是意料之中的行为。 Bug 是一个很重的词,但如果它在关闭对话框之前首先重新启用所有窗口,它当然会更好。但是关闭对话框已经是不受欢迎的行为。
不要为对话框调用 Hide()。只需将 DialogResult 属性设置为 DialogResult.Cancel 即可获得完全相同的效果,但不会出现焦点问题。如果你想再次显示对话框,你必须将它重置回无。这是一个真正的错误。
关于c# - 3 窗体 Show 和 ShowDialog 没有按预期工作,BUG?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3742819/