6

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

在我的程序中,我有一个Grid在代码中定义的一些事件:

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

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

是否有一个列表可以在某处找到列出该成员的所有当前定义的事件,_grid以便我可以检查是否还没有删除不需要的事件?

4

1 回答 1

4

更新 2

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

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

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

没有任何东西只列出事件。您可以在调试器中看到实例的所有成员(watch、quickwatch 等),并且事件具有不同的图标。然后,您可以展开其中的每一个以查看分配给事件的方法。例如:

在此处输入图像描述

如您所见,MyEventt_MyEvent为该特定实例“分配”了方法。

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

在此处输入图像描述

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

于 2013-02-12T18:32:35.180 回答