c# - 当所有者最小化时,ShowDialog() 不会将表单置于顶部

标签 c# .net winforms windows-xp

当所有者最小化时,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/

相关文章:

c# - 无论设备时区如何,都获取特定时区的 DateTime.Now?

c# - .NET 异步流读/写

c# - GridView 行编辑

c# - Task.Run() 是否需要 async/await?

c# - WPF 中是否有类似 Winforms.Show ( IWin32Window 所有者)的方法?

c# - WPF(C#) 中文本框中的不同字体大小和方向

c# - 使用 DI 在遗留代码中向 NHibernate Session 添加拦截器

c# - 如何在 C# 中将 List<dynamic> 转换为 List<OurClass>

c# - 将 .rtf 文件加载到 RichTextBox 中并维护/保留格式

winforms - 如何判断 MouseDown 事件中是否按下了 Shift?