wpf - XAML 事件何时解除 Hook ?

标签 wpf events windows-phone-8 memory-management windows-phone

我目前正在开发一个大量使用图像的 Windows Phone 8 应用程序,因此必须保持较低的内存使用量。

为了确保内存使用量保持在较低水平,我试图确保事件尽可能高效地脱钩,当然还有其他事情。

所以问题是哪个内存效率更高?

在 OnNavigedTo 和 OnNavigedFrom 事件中进行 Hook /取消 Hook ,如下所示:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    MyButton.Click += MyButton_Click(...)
}

protected override void OnNavigatedFrom(NavigationEventArgs e)
{
    MyButton.Click -= MyButton_Click(...)
}

或者 xaml 是否足够智能,可以取消 xaml 中定义的事件,如下所示:

<Button x:Name="MyButton" Click="MyButton_Click"/>

页面被导航离开后?

最佳答案

在您列出的场景中——代码隐藏中带有事件处理程序的 XAML 文件——事件所有者和处理程序都属于同一个(部分)类。这意味着,您不必担心显式删除事件处理程序。一旦页面被卸载(从中导航),它就应该有资格进行垃圾收集。

内存泄漏成为问题的场景是:

  1. 事件处理程序和事件本身由不同的对象拥有
  2. 事件的所有者是长期存在的,而处理程序的所有者是短暂的

在这种情况下,由于订阅的事件导致事件所有者持有对处理程序所有者的引用,因此它会阻止后者被垃圾收集。这就是weak events很有用——如果唯一剩下的引用是弱事件监听器,则弱事件引用允许对处理程序对象进行垃圾收集。

关于wpf - XAML 事件何时解除 Hook ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19337860/

相关文章:

Silverlight:在分层数据模板中定义事件处理程序

c# - 如何在 Windows Phone 8 应用程序中使用 Paypal 进行交易?

c# - 访问 AttachedProperty 中的 DataGrid.RowStyle

wpf - 提高绘图视觉渲染的速度

wpf - INotifyPropertyChanged.PropertyChanged 始终为 NULL

c++ - Maya Api 中的事件以捕获当前时间/帧更改

c# - WPF 样式自定义控件

javascript - Bootstrap 导航选项卡单击事件有效,选项卡标签单击除外

c# - ColorAnimation 为滑动时的 listviewItem 颜色设置动画 - WP8.1

c# - 我如何更改/设置 Windows Phone 8 中的默认字体系列