显示新表格时显示的背景窗口的一瞥

时间:2012-06-30 11:13:57

标签: c# .net winforms

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

调用另一个表单
    this.Hide();
    form3.ShowDialog(Application.OpenForms["MainForm"]);
    this.Dispose();

一切正常但是当显示一个form3时,我可以看到背景中显示的任何窗口,即:如果我打开了MS油漆,将它放在背景中,“油漆”窗口会在我的窗口上方显示时间小于一秒钟后自动转到背景。 为什么会出现这种情况。我怎么能纠正它?

2 个答案:

答案 0 :(得分: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。为此,当您要显示Form3时,将此代码放在Form2中:

form3.Shown += (_s, _e) => Application.OpenForms["Form2"].Hide();
form3.ShowDialog(Application.OpenForms["MainForm"]);
this.Dispose();

答案 1 :(得分: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();
    }

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