![](/img/trans.png)
[英]C# showdialog and this.close does not meet expectations because background is seen for a second when new window is shown
[英]Glimpse of Background window shown when new Form is displayed
我有main form.I使用form2.ShowDialog(Application.OpenForms["MainForm"]);
从Mainform调用form2 form2.ShowDialog(Application.OpenForms["MainForm"]);
然后我从form2调用另一个窗体
this.Hide();
form3.ShowDialog(Application.OpenForms["MainForm"]);
this.Dispose();
一切正常但是当一个form3显示时,我可以看到背景中显示的任何窗口,即:如果我打开了MS绘画将它放在后台,那么Paint窗口会在我的窗口上显示不到一秒钟的时间自动去背景。 为什么会出现这种情况。我怎么能纠正它?
当你调用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();
好吧,你在显示对话框之前隐藏了你的主窗口,所以很明显你会看到另一个窗口,一秒钟,无论背后是什么。 你正在做的事情也很危险,你的计划失去焦点的可能性非常高。 在显示对话框之前和之后,您的程序都没有可以获得焦点的窗口。 因此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();
}
或者只是不要隐藏你的主窗口。 它不是很有用,对话框足够烦人,是模态的并且阻止任何复制/粘贴。 防止用户完全看到窗口只是隐藏可能对用户有用的信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.