我需要知道如何检查已分配的任何事件处理程序? (在“快速观看”中)
我不确定我是否正确理解了这个问题,但我会尝试一下:
-
如何检查是否有任何事件处理程序附加到事件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
array.
或者使用Name
属性只是一个处理程序方法名称,您可以使用m_toString
字段是方法签名。
在所有有关替换的示例中TestEvent
以及您的活动名称。
[Edit]没有意识到你正在使用 WPF。 WPF 事件系统要复杂得多。
假设您有一个按钮以及要检查是否附加了任何处理程序的内容MouseLeftButtonDown
event:
- 打开 QuickWhatch。
- 粘贴按钮变量名称(假设
button1
).
- 深入研究基础类,直到到达
UIElement
。或者为了快速到达那里粘贴此((System.Windows.UIElement)(button1)).EventHandlersStore
到表达式输入。
- 找到并扩展属性
EventHandlersStore
.
- Expand
_entries
.
- Expand
_mapStore
.
- Expand
[MS.Utility....]
- 您将看到以下列表
_entry0
, _entry1
, ... _entry_n
。其中每一个都是按钮也分配有处理程序的事件。
- 要了解分配给哪些处理程序,请进一步钻取特定条目
Value
=> _listStore
.
- 您将看到以下列表
_entry0
, _entry1
... 再次。这些是附加到该特定事件的所有处理程序。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)