【问题标题】:Close all WPF windows from winforms application从 winforms 应用程序关闭所有 WPF 窗口
【发布时间】:2015-07-13 14:27:23
【问题描述】:

我通过ElementHost 控件在我的winforms 应用程序中托管一个WPF 应用程序。我已经实现了一个逻辑,它在 WPF 端监听未处理的异常。如果捕获到异常,则应释放 ElementHost 控件并关闭所有相关的 WPF 窗口。

如果只有一个 WPF 窗口,这工作得很好。由于该 WPF 应用程序可以打开更多子窗口(即未停靠的窗口),因此当我处置 ElementHost 控件时,这些窗口不会关闭。

有没有一种简单的方法可以从 winforms 端关闭 WPF 窗口和所有子窗口?

我已经尝试过Application.OpenForms,但子 WPF 窗口没有显示(不知何故有道理 ;-))。

备注:我确实拥有 WPF 代码,所以我可以在 WPF 端实现一些东西,但我真的很想坚持 win 表单端。

我还想考虑 WPF 窗口代码可能“卡住”并且无法做出反应并自行关闭的情况。这就是为什么我想从“外面”杀死窗户

【问题讨论】:

  • 好吧,保留你自己的List<Window>。在创建 WPF 窗口时添加窗口,使用窗口的 Closed 事件将其删除。
  • WPF窗口不应该在关闭时负责清理其子窗口吗?
  • @HansPassant 我没有问题找到根 WPF 窗口(因为它托管在 ElementHost
  • @cdkMoose 我基本上同意你的观点,但我在考虑 WPF 窗口可能无法做出反应并且以某种方式“卡住”的情况。然后我希望能够杀死窗户
  • 不确定我是否能想象创建孩子的 WPF 窗口无法杀死它们,但 WinForms 窗口可以杀死它们的场景。你有用例吗?

标签: c# wpf winforms window


【解决方案1】:

所以我下定决心并按照 cdkMoose 的建议让 WPF 部分处理这个问题。让知道必须做什么的人来完成清理工作可能是个好主意。不过还是谢谢!

【讨论】:

  • 只是添加...您提到的“卡住”的事情最好使用单独的 AppDomain 来处理。您可以在不影响主代码的情况下销毁/重新创建 AppDomain。请注意,虽然第二个 AppDomain 可以打开一个新窗口,但在另一个窗口中呈现来自一个域的控件将是一项挑战(您需要模拟窗口管理器的基础知识)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 2012-04-17
  • 1970-01-01
  • 2013-05-06
  • 1970-01-01
相关资源
最近更新 更多