【问题标题】:WPF UserControl Event Handler Memory LossWPF UserControl 事件处理程序内存丢失
【发布时间】:2017-12-16 06:16:56
【问题描述】:

我有一个引用 UserControl 的表单

<Label Grid.Row="1" Grid.Column="2" >Item Category</Label>
<PO:ItemCategorySelector Grid.Row="1" Grid.Column="3" x:Name="usrItemCategoryId" SelectedValueChanged="usrItemCategoryId_SelectedValueChanged"
                               IsOptional="True"  Width="250" />

事件定义如下:

   #region events
    public delegate void SelectedValueChangedDelegate(object sender, SelectedValueChangedEventArgs e);
    protected event SelectedValueChangedDelegate _SelectedValueChanged;
    public event SelectedValueChangedDelegate SelectedValueChanged
    {
        add
        {
            if (this._SelectedValueChanged == null)
                this._SelectedValueChanged += value;
        }
        remove
        {
            if (this._SelectedValueChanged != null)
                this._SelectedValueChanged -= value;
        }
    }

protected void RaiseSelectedValueChanged(modItemCategory pItemCategory)
{
    if (this._SelectedValueChanged != null)
    {
        var evt = new SelectedValueChangedEventArgs(pItemCategory);
        this._SelectedValueChanged(this, evt);
    }
}

结束区域

我在事件的 Add 和 Remove 属性上设置了断点。 当表单加载时添加属性触发器。 当我关闭表单时,删除属性永远不会触发。 这一定会导致我发现的内存泄漏。 当然,如果在 XAML 中定义了一个控件并且它链接到事件处理程序中,它应该负责删除该处理程序吗?如果不是,您将如何着手删除它?

我错过了什么?

【问题讨论】:

    标签: wpf events controls


    【解决方案1】:

    如果一个控件是在 XAML 中定义的,并且它链接到事件处理程序中,它应该负责删除该处理程序吗?

    没有,没有人为您取消订阅事件处理程序。

    但这不应该成为问题,只要事件的发布者(ItemCategorySelector)和事件的订阅者(UserControl)具有相同的生命周期。

    只要父 UserControl 实例存在,ItemCategorySelector 实例就有资格进行垃圾回收。因此,如果您遇到任何内存泄漏,可能不是因为此事件处理程序。

    如果不是,您将如何着手删除它?

    例如,您可以处理 Unloaded 事件并使用 -= 语法删除事件处理程序:

    private void usrItemCategoryId_Unloaded(object sender, RoutedEventArgs e)
    {
        usrItemCategoryId.SelectedValueChanged -= usrItemCategoryId_SelectedValueChanged;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多