WPF模态窗口作为WinForms工具窗口时消失了

6
我想知道是否有人能帮助我解决这个令人困惑的情况。我有一个WPF表单myForm,它是以模态方式在WinForm应用程序中显示的(而不使用ElementHost)。如果使用默认的WindowStyle并在任务栏中显示,一切都正常。但是,现在我不想让该表单显示在任务栏中或包含最小化按钮,因此我已经执行了以下操作:
MyForm myForm = new MyForm();
myForm.ShowInTaskbar = false;
myForm.WindowStyle = System.Windows.WindowStyle.ToolWindow;
myForm.WindowStartupLocation =System.Windows.WindowStartupLocation.CenterOwner;
myForm.ShowDialog();

现在,WPF表单按预期以模态方式显示,没有最小化按钮。如果我现在在任务栏中选择“父”WinForm应用程序,则WPF表单会消失,并且似乎没有任何方法可以返回到它!我已经阅读了类似但不相同的内容(纯WPF应用程序)此处,因此我可以理解为什么主应用程序不会出现在ALT + TAB菜单中,但有人能告诉我如何返回到WPF表单吗?
先谢过。

只是想澄清一下,问题是如果 WPF 工具窗口被推到主应用程序或另一个应用程序的后面,你就无法将窗口前置,对吧? - CodingGorilla
1
你尝试过设置工具窗口的所有者吗?即使你混合使用winforms和wpf,这也应该可以工作。你可以使用WindowsInteropHelper或直接使用winapi调用SetParent来实现这一点。 - dowhilefor
@CodingGorilla 是的,没错。 - Jeb
1
所有者是问题所在。这是一个棘手的问题,因为您没有窗口可以作为所有者。您必须使用PInvoke SetWindowLongPtr()来设置所有者。 - Hans Passant
2个回答

6
使用 WindowsInteropHelper 可以将托管的 WPF 表单包装在 Winforms 表单中,并将其父项设置为 Winforms 控件,从而防止 WPF 表单消失(正如 dowhilefor 和 Hans Passant 所指出的那样)。
例如:
// Use the interop helper for the specified wpf window hosted by the win32 owner
WindowInteropHelper wih = new WindowInteropHelper(wpfForm);
wih.Owner = this.someWin32FormsControl.Handle;

1

这与Winforms或WPF无关,这是Windows功能的方式。我认为你唯一的解决方案是连接你的模态; 即拦截Winforms表单上的Activated事件,如果你的WPF工具窗口可见,则将该窗口置于前台并使其获得焦点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接