【问题标题】:In WPF, does this line leak?在 WPF 中,这条线是否泄漏?
【发布时间】:2009-02-13 11:06:07
【问题描述】:

如果我们从视觉和逻辑树中删除TextBox,这条线会泄漏吗? 对我来说,这是因为Mouse.MouseDownmyHandler 上有一个引用,并且没有做任何事情来删除处理程序。

<TextBox Mouse.MouseDown="myHandler" />

我不确定,因为这段代码是常见的做法。

【问题讨论】:

  • 您可以随时尝试获取内存分析器(例如 Redgate 的 ANTS)并使用此事件订阅测试一个小项目。你应该可以看到TextBox是否被释放了。

标签: wpf memory-leaks


【解决方案1】:

它会泄漏吗?该 XAML 直接转换为以下代码(参见 obj 目录中生成的 Window1.g.cs 文件)

((System.Windows.Controls.TextBlock)(target)).AddHandler(System.Windows.Input.Mouse.MouseDownEvent, new System.Windows.Input.MouseButtonEventHandler(this.TextBlock_MouseDown));

所以,实际发生的是我们正在向 TextBlock 添加“this”的引用(在我的例子中是 Window1 的实例)。您在 XAML 中看到的语法实际上是为路由事件或附加事件附加 RoutedEvent 处理程序的语法。恰好语法使您看起来像是在分配一些参考。看看这个:Routed Events OverviewAttached Events Overview

编辑:总之,它不会泄漏。 :)

Edit2:如果您对 TextBlock 有任何引用,则会泄漏。但是,如果当您切换出 TextBlock 时,确保不再有对该元素的引用,那就没问题了。

【讨论】:

  • 好的,这意味着没有泄漏。谢谢你的回答!
  • 如果对 TextBlock 的引用保留在代码中的其他位置,则会泄漏。请注意,路由事件不是弱事件。
  • 是的,但由于没有,那一行代码不会泄漏。 :) 我会编辑以反映这个细节。
猜你喜欢
  • 2011-01-16
  • 1970-01-01
  • 2011-12-19
  • 2010-12-27
  • 2016-09-20
  • 1970-01-01
  • 1970-01-01
  • 2010-11-25
相关资源
最近更新 更多