c# - 如何使用 Debugger (VS Professional 2012) 查找事件列表?

标签 c# wpf debugging events visual-studio-2012

好吧,我的问题找不到任何帮助,而且 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 等),并且事件具有不同的图标。然后您可以展开其中的每一个以查看分配给事件的方法。例如:

enter image description here

如您所见,MyEvent 已为此特定实例“分配”方法 t_MyEvent

更新: 如果您为一个事件分配了多个事件处理程序,则调试器将仅在快速监视中的事件顶层显示最后分配的方法。要查看所有 分配的方法,您需要向下钻取到调用列表。例如:

enter image description here

.. 这表明 t_MyEventt_MyEvent2 都在 MyEvent 的调用列表中。如果您没有处理程序,则 MyEvent 的值将为 null

<罢工>

关于c# - 如何使用 Debugger (VS Professional 2012) 查找事件列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14839050/

相关文章:

wpf - 在 WPF 中,如何在具有焦点的窗口部分周围放置边框?

c++ - 调试深入我的代码

c# - 按字母顺序插入列表 C#

c# - 从安装项目运行应用程序不返回 UI 区域性

c# - 如何同时使用 SqlConnection 和 DataContext?

c# - LINQ 联合和不同

c# - WPF WebBrowser 控件的自定义上下文菜单

wpf - 工具提示与弹出窗口(WPF控件)

windows - 如何将Softice窗口中显示的数据转为文本文件

python - 使用 pdb 调试 python 时如何更改值?