关于WPF调试焦点问题的任何提示?

时间:2010-07-28 09:15:43

标签: .net wpf debugging focus

具体来说,我有一个打开非模态子窗口的按钮。当主窗口打开时,主窗口中的某些东西会将焦点从子窗口中移开。

完全通用的方法是注释掉部分代码,直到问题消失。我正在寻找更快的方法。

6 个答案:

答案 0 :(得分:24)

我正在使用Snoop来执行此操作。

对于初学者,Snoop会在状态栏中显示当前的焦点元素和当前的FocusScope。

你可以让它向你展示所有GotFocus和LostFocus事件:

  1. 运行您的应用。
  2. Run Snoop。
  3. 在下拉列表中选择您的应用。
  4. 单击双筒望远镜(“Snoop”)按钮。
  5. 在右侧窗格中,单击“事件”选项卡。
  6. 点击以关闭下拉列表。
  7. 向下滚动到“键盘”部分,然后选中GotKeyboardFocus,LostKeyboardFocus和可选的PreviewXXX事件。
  8. 现在做你需要做的事情来操纵焦点并观看Snoop窗口。
  9. 同样,您可以用同样的方式跟踪FocusManager事件。

答案 1 :(得分:0)

我自己没有尝试过,所以无法确定具体步骤,但您可以尝试使用FocusManager.FocusedElementFocusManager.GetFocusedElement Method来尝试从子窗口中找到隐藏焦点的元素。

其他有用的链接 -

  

焦点概述(有代码获取   重点要素):   http://msdn.microsoft.com/en-us/library/aa969768.aspx#Focus_Events

答案 2 :(得分:0)

您可以尝试使用UI SpySnoop等工具来观察更改焦点的事件。我没有将这些工具用于此目的,但我相信他们可以帮助你。

答案 3 :(得分:0)

您可以尝试使用Runtime Flow(由我开发)在您的应用程序上下文中跟踪对System.Window.UIElement.Focus方法(在PresentationCore.dll中)的调用。

答案 4 :(得分:0)

请你提一下主要的操作(没有进入客户特定的业务 - 如果它是一个客户端项目) - 就像有任何事件挂钩到元素,任何其他操作发生在按钮点击 - 任何发生的事情显示子窗口后父窗口中的任何元素都会窃取焦点。还要检查在按钮点击事件期间发生的任何相关事件。

这些是您开始调查的一些方法。

答案 5 :(得分:0)

我刚看到一些死锁...希望这有帮助(在msdn.microwoft.com中搜索control.leave

注意 不要尝试从Enter,GotFocus,Leave,LostFocus,Validating或Validated事件处理程序中设置焦点。这样做可能会导致您的应用程序或操作系统停止响应。有关详细信息,请参阅“键盘输入参考”部分中的WM_KILLFOCUS主题,以及http://msdn.microsoft.com/library处MSDN库中“关于消息和消息队列”主题的“消息死锁”部分。