0

我有主表单。我从 Mainform 调用 form2 使用form2.ShowDialog(Application.OpenForms["MainForm"]); 然后我从 form2 调用另一个表单

    this.Hide();
    form3.ShowDialog(Application.OpenForms["MainForm"]);
    this.Dispose();

一切正常,但是当显示 form3 时,我可以瞥见背景中显示的任何窗口,即:如果我打开了 MS Paint,则将其放在背景中,Paint 窗口将出现在我的窗口顶部不到一秒的时间,并且自动转到后台。为什么会出现这种行为。我该如何纠正?

4

2 回答 2

1

当您调用时this.Hide(),Form2 被隐藏,另一个窗口需要获得焦点。但是,您使用 ShowDialog 打开了 Form2,这意味着 Form2 是唯一可以在您的应用程序中获得焦点的窗口。但是由于您隐藏了 Form2,Windows 会找到另一个要关注的窗口(在本例中为 MS Paint)。

解决方案的一个建议可能是在隐藏 Form2 之前人为地赋予 MainForm 焦点:

Application.OpenForms["MainForm"].Activate();
this.Hide();
form3.ShowDialog(Application.OpenForms["MainForm"]);
this.Dispose();

也许一个更漂亮的解决方案是首先打开 Form3,等待它显示,然后隐藏 Form2。为此,请将此代码放在 Form2 中,当您要显示 Form3 时:

form3.Shown += (_s, _e) => Application.OpenForms["Form2"].Hide();
form3.ShowDialog(Application.OpenForms["MainForm"]);
this.Dispose();
于 2012-06-30T12:41:33.410 回答
1

好吧,你在显示对话框之前隐藏了你的主窗口,所以你会在一瞬间看到另一个窗口,无论哪个在它后面。你正在做的事情也非常冒险,你的程序失去焦点的可能性非常高。在显示对话框之前,尤其是在显示对话框之后,您的程序都没有可以接收焦点的窗口。所以Windows窗口管理器被迫寻找另一个窗口来给予焦点,它会选择另一个应用程序的窗口。强迫你在后台,如果那个窗口足够大,让它完全消失。

你需要采取反制措施。您可以通过延迟 Hide() 调用来隐藏主窗口,表单的 BeginInvoke() 方法非常方便。而且您需要确保在对话框关闭之前您的主窗口再次可见。对话框的 FormClosing 事件很方便。如果对话框已经连接事件而不是覆盖 OnFormClosing(),尽管不是 100% 可靠。

因此:

    private void DisplayDialog_Click(object sender, EventArgs e) {
        using (var dlg = new Form2()) {
            this.BeginInvoke(new Action(() => this.Hide()));
            dlg.FormClosing += dlg_FormClosing;
            dlg.StartPosition = FormStartPosition.Manual;
            dlg.Location = this.Location;
            if (dlg.ShowDialog() == DialogResult.OK) {
                // etc..
            }
            dlg.FormClosing -= dlg_FormClosing;
        }
    }

    void dlg_FormClosing(object sender, FormClosingEventArgs e) {
        if (!e.Cancel) this.Show();
    }

或者只是不要隐藏你的主窗口。它不是很有用,对话框按原样很烦人,是模态的并防止任何复制/粘贴。阻止用户完全看到窗口只是隐藏了可能对用户有用的信息。

于 2012-06-30T13:02:10.010 回答