我有一个复杂的WPF应用程序,其中包含多个线程上的窗口。相当可重复的是,当我打开和关闭一个新窗口时,焦点(激活)不会返回到上一个激活的窗口。而是(通常)较旧的窗口被激活。由于工作流程是“在窗口A中工作”,“从A打开窗口B,C”,“使用B,C”,“从B打开窗口D”,“关闭D”,我需要窗口返回焦点到B,但实际上是A。
我已经看过Window.Activated和Window.Deactivated事件周围的堆栈跟踪,但这些事件直接来自WPF基础架构并且没有显示任何线索。我已经尝试过Spy ++,但它的用处是有限的。
如何进一步调试?
更新:当我在创建D时停止阻止B线程更长时间后,这种现象消失了。似乎是桌面窗口管理器变得困惑,当线程阻塞它们时消息泵。在创建D之前,我已经通过将消息泵阻止程序推送到具有后台优先级的Dispatcher来解决问题。这似乎清除了任何DWM混淆,并且Windows激活不再起作用。我仍然对更深入的解决方案/分析有兴趣。
答案 0 :(得分:0)
您可能不希望听到这一点,但在这些情况下,我采取的下一步是立即检查相关现象堆栈中方法的参考源。我不知道您之前是否使用过参考源:
设置此设置,然后在常规位置设置断点,比如焦点事件。现在查看堆栈。您应该能够双击并查看大多数堆栈帧的源代码。当然这是一个废话,但无论如何比看方法名更好。
如果您发现要检查参考源侧的某些变量,您会发现它们不起作用。使用此修复程序:
我知道这不是很具体,但这是我接下来会尝试的。