我需要知道如何检查已分配的任何事件处理程序? (在QuickWatch中)
答案 0 :(得分:4)
我不确定我是否正确理解了这个问题,但我会试一试:
如何检查是否有任何事件处理程序附加到事件TestEvent
:
TestEvent
将为null。
如果附加了一个处理程序(单播委托)_invocationList == 0
:
将以下内容粘贴到QuickWatch表达式字符串:
((System.Reflection.RuntimeMethodInfo)(((System.Delegate)(TestEvent))._methodBase)).Name
找出附加的事件处理程序。
如果附加了多个处理程序(多播委托)_invocationList > 0
:
您需要查看_invocationList
,例如检查第一个附加方法:
((System.Reflection.RuntimeMethodInfo)(((System.Delegate)(((object[])(((System.MulticastDelegate)(TestEvent))._invocationList))[0]))._methodBase)).Name
要检查其他附加处理程序:将索引更改为1,2等,或者只展开_invocationList
数组的每个元素。
除了使用只是处理程序方法名称的Name
属性之外,您还可以使用m_toString
字段作为方法签名。
在所有关于将TestEvent
替换为您的活动名称的示例中。
[编辑] 没有意识到您正在使用WPF。 WPF事件系统要复杂得多。
假设您有一个按钮以及检查是否有任何处理程序附加到MouseLeftButtonDown
事件的内容:
button1
)。UIElement
。或者快速将此((System.Windows.UIElement)(button1)).EventHandlersStore
粘贴到表达式输入。EventHandlersStore
。_entries
。_mapStore
。[MS.Utility....]
_entry0
,_entry1
,... _entry_n
的列表。其中每个都是按钮分配处理程序的所有事件。Value
=> _listStore
。_entry0
,_entry1
的列表。这些都是这个特定事件的处理者。