Winforms-显示来自不同线程的表单,并将z顺序与主表单同步

本文关键字:表单 并将 同步 顺序 显示 线程 Winforms- | 更新日期: 2023-09-27 18:27:47

我需要在winform Timer线程上触发的CollectionChanged事件上显示一个窗体。但是,新对话框没有绑定到主窗口,也就是说,当对话框聚焦时,主窗口不会显示在前面,反之亦然。此外,新窗口没有"继承"应用程序图标(在alt选项卡视图中可以看到)

using( var form = new CommunicationForm() { Owner = (MainForm)Parent.Parent } ){
    form.ShowDialog();
}

我认为这可能是由于代码没有在主线程上执行或Ower没有被分配(当在按钮中显示表单时(它不是主窗口的直接子窗口),点击它可以按预期工作),所以我尝试在主线程中运行它并分配父窗口

this.Invoke( (MethodInvoker)delegate {
    using( var form = new CommunicationForm() { Owner = (MainForm)Parent.Parent } ) {
        form.ShowDialog();
    }
} );

这稍微好一点,但在将应用程序放在前面并关闭对话框之后,主窗体仍被向后推(按z顺序)。我认为这是由于显示对话框时主窗口不在顶部造成的。

问题是,我还是做错了吗?如果没有,如何在对话框关闭后使主窗体保持在前面?

Winforms-显示来自不同线程的表单,并将z顺序与主表单同步

在显示CommunicationForm时,应该将MainForm实例引用传递给Form.ShowDialog()方法。