当所有者最小化时,ShowDialog() 不会将表单置于顶部。它已显示且可见,但未聚焦且位于当前窗口后面。即使使用注释行,我也看到了问题。
public void Form1_Click(object sender, EventArgs e)
{
this.WindowState = FormWindowState.Minimized;
// this.Hide();
using (var f = new Form1())
{
// this.WindowState = FormWindowState.Normal;
f.Text = "ShowDialog()";
f.Click -= new EventHandler(f.Form1_Click);
f.ShowDialog(this); // f is not on top?
this.Show();
}
}
最佳答案
this.WindowState = FormWindowState.Minimized;
一旦执行,应用程序中就没有任何窗口可以接收焦点。 Windows 需要找到另一个窗口来给予焦点,它将是另一个应用程序的窗口。稍后您的对话框就会出现,但为时已晚,焦点已经丢失。
使用像 Control.BeginInvoke() 这样的技巧来最小化对话框显示后的表单也不起作用,当它的父级最小化时,对话框会自动关闭。你能做的最好的事情就是隐藏它。您必须在对话框关闭之前使用相同的技巧来恢复它,否则您仍然会失去焦点。像这样:
protected override void OnClick(EventArgs e) {
using (var f = new Form1()) {
f.Text = "ShowDialog()";
this.BeginInvoke(new Action(() => this.Hide()));
f.FormClosing += delegate { this.Show(); };
f.ShowDialog();
}
}
关于c# - 当所有者最小化时,ShowDialog() 不会将表单置于顶部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3561774/