好吧,我的问题找不到任何帮助,而且 stackoverflow 似乎也没有任何帮助,或者我不知道如何查找它(请纠正我,如果我错了,我会关闭这个问题)。
在我的程序中,我有一个 Grid
,它有一些在代码中定义的事件:
public Grid _grid = new Grid();
_grid.MouseLeftButtonDown += new MouseButtonEventHandler(MyMethod);
//and a few more events...
现在在我的程序运行期间,我看到了一些只能来自某些事件的奇怪行为,所以我设置了一个断点并停止了程序以使用调试器。
有没有我可以在某处找到的列表,其中列出了成员 _grid
的所有当前定义的事件,以便我可以检查是否没有不需要的事件尚未被删除?
最佳答案
更新 2
不幸的是,WPF 中的大多数事件(即在 UIElement
上)都是通过手动实现 add
/remove
来实现的,这意味着事件成员只能位于 -=
或 +=
运算符的左侧(即它不能被“读取” ”)。内部结构是这样的,每个事件都被“委托(delegate)”到一个事件集合,并且该集合只包含分配事件的元素(例如,如果有一个 MouseLeftButtonDownEvent += somehandler;
,那么该事件集合将只有一个条目。不幸的是,事件集合是什么表示处理程序的存储是一个内部结构,您必须能够实例化它才能查询集合。您无法实例化该结构的实例( RoutedEventHandlerInfo
,FWIW)以查询集合( UIElement.EventHandlersStore._entries
,也 FWIW) . 例如,如果可以的话,您可以在 QuickWatch 窗口中查询特定事件的处理程序:
grid.EventHandlersStore._entries[
new RoutedEventHandlerInfo(UIElement.MouseLeftButtonDownEvent, false)]
但是,调试器不允许您调用内部构造函数。 <罢工>罢工>
<罢工>没有仅事件的列表。您可以在调试器中看到一个实例的所有成员(watch、quickwatch 等),并且事件具有不同的图标。然后您可以展开其中的每一个以查看分配给事件的方法。例如:
如您所见,MyEvent
已为此特定实例“分配”方法 t_MyEvent
。
更新: 如果您为一个事件分配了多个事件处理程序,则调试器将仅在快速监视中的事件顶层显示最后分配的方法。要查看所有 分配的方法,您需要向下钻取到调用列表。例如:
.. 这表明 t_MyEvent
和 t_MyEvent2
都在 MyEvent
的调用列表中。如果您没有处理程序,则 MyEvent
的值将为 null
。
<罢工>罢工>
关于c# - 如何使用 Debugger (VS Professional 2012) 查找事件列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14839050/