我正在使用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资源管理器)时,才会发生这种情况。好像是个错误。你怎么看?

最佳答案

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

有更多的副作用,对话框也会关闭。这是必要的,因为否则,由于所有窗口均被禁用,用户再也无法返回到您的程序了。这都是毫不奇怪的行为。 Bug是一个好词,但如果在关闭对话框之前先重新启用所有窗口,则它当然会更好。但是关闭对话框已经是不受欢迎的行为。

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

关于c# - 3个表格Show和ShowDialog不能按预期工作,BUG?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3742819/

10-11 05:59