【发布时间】:2011-05-03 09:19:15
【问题描述】:
我有一个复杂的 WPF 应用程序,其窗口位于多个线程上。相当重现,当我打开和关闭一个新窗口时,焦点(激活)不会回到最后一个激活的窗口。相反,一个(通常)较旧的窗口被激活。由于工作流程是“在窗口 A 中工作”、“从 A 打开窗口 B、C”、“使用 B、C”、“从 B 打开窗口 D”、“关闭 D”,我需要窗口来返回焦点到 B,但实际上它到了 A。
我已经查看了围绕 Window.Activated 和 Window.Deactivated 事件的堆栈跟踪,但是这些直接来自 WPF 基础结构并且没有显示任何线索。我已经尝试过 Spy++,但它的用处......有限。
如何进一步调试?
更新:我在创建D的时候,长时间停止阻塞B的线程后,现象消失了。似乎是桌面窗口管理器变得混乱,当线程阻塞他们的消息泵。在创建 D 之前,我通过将消息泵阻止程序推送到具有后台优先级的 Dispatcher 来解决这个问题。这似乎消除了任何 DWM 混乱,并且 Windows 激活不再起作用。我仍然对指向更深入的解决方案/分析的指针感兴趣。
【问题讨论】:
-
也许 Snoop 可以帮助您。 snoopwpf.codeplex.comSnoop 是一个非常强大的 WPF 应用程序的间谍工具。
-
Snoop 不显示事件信息,我相信事件的来源在 WPF 之外。
标签: wpf multithreading focus