2009-02-09 14 views
5

我知道,当你注册一个对象到鼠标的附加事件时,你有内存泄漏。这就是为什么你需要使用WeakEvent pattern内置的WPF控件如何管理其事件处理程序以附加事件?

我对这种模式有一个问题:如果你想使用它,你不能在XAML代码中定义你的处理程序。

对我来说,这意味着这样每个代码泄漏:

<SomeControl Mouse.MouseDown="MyHandler" /> 

除非你明确地删除您的处理程序代码(我怀疑任何人都不会说)。 现在有件事我不明白:

<Button Click="MyHandler" /> 

此代码以某种方式使用某处Mouse.MouseDown事件来检测按钮的点击。我发现这个事件使用了UIElement类的MouseDown。当我读取UIElement的代码时,我不明白:没有WeakEventManager!

能有人可以解释我收到了如何的UIElement事件从Mouse.MouseDown不泄漏?

回答

7

在XAML中使用常规处理程序不需要弱引用。

你在做什么是创建主控制和该控件中包含子控件之间的内存参考;在这种情况下,子控件是按钮。

如果有人坚持到主控制的可视化树的任何部分的引用,整棵树会留在内存中,因为它被连接在一起(父/子引用)。

现在,如果所有引用此树被删除,因为这些控件是通过父/子引用已链接父母和子女(主要控制按钮)之间的事件引用不是显著。一旦所有的外部引用被删除,这个控件就可以被垃圾收集。

XAML中的事件处理程序仅创建内部事件引用。

你有当外部客户端注册上的控件的事件要小心了,因为你正在创建一个外部参考,将继续控制活着,只要链接和客户端存在(除非它是一个弱引用) 。

你的问题是关于附加事件。似乎没有任何关于附加事件是否导致内存泄漏的明确文档。在我看来,像订阅该事件的UI控件包含对事件的引用而不是其他方式,但我认为静态事件对象必须具有某种方式通知控件它已被触发。微软对此似乎缺乏评论。

+0

我同意你的观点,但在处理XAML到连接的事件(我不谈论控件的事件,但事件Mouse.MouseDown)可能会泄漏,因为总是有它的参考。 在内部,Button类使用Mouse.MouseDown事件(UIElement具体)。我不知道为什么这不会泄漏。 – 2009-02-09 21:34:13

相关问题