好的,我找不到任何帮助我的问题和stackoverflow似乎也没有任何东西,或者我不知道如何寻找它(请纠正我,如果我错了,我会关闭这个问题)。
在我的计划中,我有一个Grid
,其代码中定义了一些事件:
public Grid _grid = new Grid();
_grid.MouseLeftButtonDown += new MouseButtonEventHandler(MyMethod);
//and a few more events...
现在在我的程序运行期间,我看到一些奇怪的行为只能来自某些事件,所以我设置了一个断点并停止程序使用调试器。
我是否可以找到列出成员_grid
当前定义的所有事件的列表,以便检查是否尚未删除任何不需要的事件?
答案 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)]
但是,调试器不允许您调用内部构造函数。 <击> 撞击>
<击>没有列出 事件的内容。您可以在调试器中看到实例的所有成员(监视,快速监视等),并且事件具有不同的图标。然后,您可以展开其中的每一个,以查看为事件分配的方法。例如:
如您所见,MyEvent
已为此特定实例“分配”方法t_MyEvent
。
<强>更新强> 如果为事件分配了多个事件处理程序,则调试程序将仅在快速监视中显示事件顶级中的最后一个分配方法。要查看所有分配的方法,您需要深入查看调用列表。例如:
..这表明t_MyEvent
和t_MyEvent2
都在MyEvent
的调用列表中。如果您没有处理程序,MyEvent
的值将为null
。
<击> 撞击>