首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >显示新表单时显示的背景窗口一瞥

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

Stack Overflow用户
提问于 2012-06-30 19:13:57
回答 2查看 228关注 0票数 0

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

代码语言:javascript
代码运行次数:0
运行
复制
    this.Hide();
    form3.ShowDialog(Application.OpenForms["MainForm"]);
    this.Dispose();

一切正常,但当form3显示时,我可以看到任何在后台显示的窗口,例如:如果我打开了MS paint,将它放在后台,Paint窗口将在我的窗口顶部出现不到一秒的时间,并自动转到后台。为什么这个behavior.How我可以纠正它?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-30 20:41:33

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

一个解决方案的建议是在隐藏Form2之前人为地让MainForm获得焦点:

代码语言:javascript
代码运行次数:0
运行
复制
Application.OpenForms["MainForm"].Activate();
this.Hide();
form3.ShowDialog(Application.OpenForms["MainForm"]);
this.Dispose();

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

代码语言:javascript
代码运行次数:0
运行
复制
form3.Shown += (_s, _e) => Application.OpenForms["Form2"].Hide();
form3.ShowDialog(Application.OpenForms["MainForm"]);
this.Dispose();
票数 1
EN

Stack Overflow用户

发布于 2012-06-30 21:02:10

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

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

因此:

代码语言:javascript
代码运行次数:0
运行
复制
    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();
    }

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11273621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档