2011-06-14 56 views
6

我需要知道如何检查已分配的任何事件处理程序? (在快速监视)如何检查事件处理程序分配或不在QuickWatch

+0

你是问如何检查是否有任何事件处理程序附加到事件? – 2011-06-14 05:05:32

+0

是的,但我需要检查quickwatch。 – hashi 2011-06-14 05:10:30

+0

如果不知道如何实现添加和删除访问器,这通常是不可能的。在Winforms中是不可能的。 – 2011-06-14 06:54:19

回答

4

我不知道如果我理解正确的问题,但我会给它一个镜头:

  1. 如何检查是否连接到一个事件TestEvent任何事件处理程序:

    如果没有附加事件处理程序,则

    TestEvent将为空。

  2. 如果一个处理器连接(单播委托)_invocationList == 0

    粘贴下面的监视表达式字符串:

    ((System.Reflection.RuntimeMethodInfo)(((System.Delegate)(TestEvent))._methodBase)).Name 
    

    找出事件处理程序连接。

  3. 如果有多个处理程序连接(多播委托)_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事件:

  1. 打开QuickWhatch。
  2. 粘贴你按钮变量名称(比如说button1)。
  3. 深入了解基础类,直到找到UIElement。或者要快速将此((System.Windows.UIElement)(button1)).EventHandlersStore粘贴到表达式输入。
  4. 找到并扩大属性EventHandlersStore
  5. 展开_entries
  6. 展开_mapStore
  7. 展开[MS.Utility....]
  8. 你会看到的_entry0_entry1名单,... _entry_n。这些都是按钮处理程序分配的所有事件。
  9. 要了解分配了哪些处理程序,请进一步钻取特定条目Value =>_listStore
  10. 您将再次看到_entry0_entry1 ...的列表。这些都是附属于这个特殊事件的处理者。

enter image description here

+0

感谢发布。如何在quickwatch中显示所有事件处理程序的一些对象?例如我需要显示MouseLeftButtonDown或MouseMove,...为null或不。 – hashi 2011-06-14 05:36:08

+0

@hashi - 更新了答案 – 2011-06-14 06:21:03

+0

非常感谢,你对SilverLight建议吗? – hashi 2011-06-14 07:05:24

相关问题