C# 使用show和hide在两个窗体之间进行转换的行为与我预期的不一样

C# 使用show和hide在两个窗体之间进行转换的行为与我预期的不一样,c#,.net,winforms,C#,.net,Winforms,我有两张表格。第一个是父级,包含对第二个的引用和按钮: public class Form1:Form { private Form2 frm2; private Button btnShow; ... } 当我按下按钮时,frm2必须显示(在所有其他窗口前可见),Form1必须隐藏 当我按下frm2的关闭框时,frm2必须隐藏,Form1必须显示(相反) 我使用btnShow的click事件注册了一个句柄,它所做的只是: private void cl

我有两张表格。第一个是父级,包含对第二个的引用和按钮:

public class Form1:Form {

       private Form2 frm2;
       private Button btnShow;
...

}
当我按下按钮时,frm2必须显示(在所有其他窗口前可见),Form1必须隐藏

当我按下frm2的关闭框时,frm2必须隐藏,Form1必须显示(相反)

我使用btnShow的click事件注册了一个句柄,它所做的只是:

    private void click(object sender, EventArgs e)
    {
        Hide();
        frm2.Show(this);
    }
在frm2的形式交割事件中:

    private void byebye(object sender, FormClosingEventArgs e)
    {
        if (e.CloseReason == CloseReason.UserClosing)
        {
            e.Cancel = true;
            Hide();
            Owner.Show();
        }
    }
我的代码在90%的时间内有效,但有时(我无法指定何时)显示的表单 没有被带到前面或失去焦点(我不确定我认为是第一个)

我做错了什么。我尝试了交替显示和隐藏的顺序,并使用了一个新的引用,而不是所有者,我也使用了Activate、BringToFront、Focus,但没有成功…

为什么不简单:

{
    Form2 fm = new Form2();
    this.Visible = false;
    fm.ShowDialog();
    this.Visible = true;
}
适合我。

为什么不简单:

{
    Form2 fm = new Form2();
    this.Visible = false;
    fm.ShowDialog();
    this.Visible = true;
}
    Hide();
    Owner.Show();
对我有用

    Hide();
    Owner.Show();
你这样做是不对的。在瞬间,应用程序中没有一个窗口可以接收焦点。Windows窗口管理器被迫查找另一个窗口以将焦点提供给。这将是另一个应用程序的窗口。很有可能这是一个足够大的窗口来覆盖你自己。因此,您的Show()调用将使您的窗口再次可见,但现在位于移动到前景的窗口下方。顺便说一句,这并不总是发生,窗口管理器似乎使用了一个小的超时。所有者被隐藏的时间越长,其代码被替换掉的可能性就越大,显示它所需的时间也就越长,从而导致超时被绊倒

解决方法很简单,只需交换这两个语句,就可以始终有一个可以聚焦的窗口。修正:

    Owner.Show();
    Hide();
你这样做是不对的。在瞬间,应用程序中没有一个窗口可以接收焦点。Windows窗口管理器被迫查找另一个窗口以将焦点提供给。这将是另一个应用程序的窗口。很有可能这是一个足够大的窗口来覆盖你自己。因此,您的Show()调用将使您的窗口再次可见,但现在位于移动到前景的窗口下方。顺便说一句,这并不总是发生,窗口管理器似乎使用了一个小的超时。所有者被隐藏的时间越长,其代码被替换掉的可能性就越大,显示它所需的时间也就越长,从而导致超时被绊倒

解决方法很简单,只需交换这两个语句,就可以始终有一个可以聚焦的窗口。修正:

    Owner.Show();
    Hide();

如果不介意父窗体在后台可见,则可以使用ShowDialog,这是正常行为。如果不介意父窗体在后台可见,则可以使用ShowDialog,这是正常的行为。这种方法遇到了完全相同的问题。这种方法遇到了完全相同的问题。我认为这就成功了。问题是我不确定,因为这个问题非常罕见。我会再测试一点,然后我会接受这个作为正确的anwser。我想这就成功了。问题是我不确定,因为这个问题非常罕见。我将对它进行更多的测试,然后我将接受它作为正确的anwser。