0

我有两种形式。第一个是父级,包含对第二个的引用和一个按钮:

public class Form1:Form {

       private Form2 frm2;
       private Button btnShow;
...

}

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

当我按下frm2的closebox时,frm2必须隐藏并且Form1必须显示(反向)。

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

    private void click(object sender, EventArgs e)
    {
        Hide();
        frm2.Show(this);
    }

在 frm2 的 FormClosing 事件中:

    private void byebye(object sender, FormClosingEventArgs e)
    {
        if (e.CloseReason == CloseReason.UserClosing)
        {
            e.Cancel = true;
            Hide();
            Owner.Show();
        }
    }

我的代码在 90% 的时间内都有效,但有时(我无法指定何时)显示的表单没有被带到前面或失去焦点(我不确定我认为是第一个)。

我做错了什么。我尝试交替显示和隐藏的顺序并使用新的参考而不是所有者,我也使用了激活,BringToFront,焦点但没有成功......

4

2 回答 2

2

为什么不简单:

{
    Form2 fm = new Form2();
    this.Visible = false;
    fm.ShowDialog();
    this.Visible = true;
}

为我工作。

于 2013-03-03T16:43:00.287 回答
1
    Hide();
    Owner.Show();

你这样做是错误的。一瞬间,您的应用程序中没有一个可以接收焦点的窗口。Windows 窗口管理器被迫寻找另一个窗口来获得焦点。这将是另一个应用程序的窗口。很有可能这是一个足够大的窗口来覆盖你自己的。因此,您的 Show() 调用将使您的窗口再次可见,但现在位于已移至前台的窗口下方。顺便说一句,这并不总是发生,窗口管理器似乎使用了一个小超时。所有者被隐藏的时间越长,其代码被换出的可能性就越大,并且显示它需要更多时间,从而触发超时。

解决方法很简单,只需交换两个语句,这样您就可以始终拥有可以聚焦的窗口。使固定:

    Owner.Show();
    Hide();
于 2013-03-03T17:05:11.547 回答