如何使用Debugger(VS Professional 2012)查找事件列表?

时间:2013-02-12 18:15:47

标签: c# wpf debugging events visual-studio-2012

好的,我找不到任何帮助我的问题和stackoverflow似乎也没有任何东西,或者我不知道如何寻找它(请纠正我,如果我错了,我会关闭这个问题)。

在我的计划中,我有一个Grid,其代码中定义了一些事件:

public Grid _grid = new Grid();
_grid.MouseLeftButtonDown += new MouseButtonEventHandler(MyMethod);
//and a few more events...

现在在我的程序运行期间,我看到一些奇怪的行为只能来自某些事件,所以我设置了一个断点并停止程序使用调试器。

我是否可以找到列出成员_grid当前定义的所有事件的列表,以便检查是否尚未删除任何不需要的事件?

1 个答案:

答案 0 :(得分:4)

更新2

不幸的是,WPF中的大多数事件(即在UIElement上)都是通过手动实现add / remove来实现的,这意味着事件成员只能位于-=的左侧。 {1}}或+=运算符(即不能“读取”)。内部是这样的,每个事件被“委托”到一组事件,并且该集合仅包含已分配事件的元素(例如,如果只有一个MouseLeftButtonDownEvent += somehandler;,那么事件集合将只有一个条目。不幸的是,什么表示处理程序的事件存储集合是一个内部结构,您必须能够实例化以查询集合。您无法实例化该结构的实例(RoutedEventHandlerInfo,FWIW)以便查询集合(UIElement.EventHandlersStore._entries,也就是FWIW)。例如,如果你能,你可以在QuickWatch窗口中查询特定事件的处理程序:

grid.EventHandlersStore._entries[
    new RoutedEventHandlerInfo(UIElement.MouseLeftButtonDownEvent, false)]

但是,调试器不允许您调用内部构造函数。 <击>

<击>

没有列出 事件的内容。您可以在调试器中看到实例的所有成员(监视,快速监视等),并且事件具有不同的图标。然后,您可以展开其中的每一个,以查看为事件分配的方法。例如:

enter image description here

如您所见,MyEvent已为此特定实例“分配”方法t_MyEvent

<强>更新 如果为事件分配了多个事件处理程序,则调试程序将仅在快速监视中显示事件顶级中的最后一个分配方法。要查看所有分配的方法,您需要深入查看调用列表。例如:

enter image description here

..这表明t_MyEventt_MyEvent2都在MyEvent的调用列表中。如果您没有处理程序,MyEvent的值将为null

<击>