为什么UserControl的Unloaded事件不会触发?

时间:2017-01-07 12:55:08

标签: c# xaml windows-store-apps uwp

我刚刚在我正在开发的一个简单的Windows应用商店应用中发现了一个巨大的内存泄漏。

事实证明,我已将UserControl放在ListView的ItemTemplate中,并挂钩UserControl的Unloaded事件以分离某个事件处理程序。

我预计当ListView的项目清除时,UserControl的Unloaded事件将会触发,但不会!但是当我逐个删除项目时,UserControl的Unloaded事件将按预期触发。

任何人都可以给我一些建议吗?或者除了挂钩Unloaded事件之外,我应该把清理代码放在哪里。任何想法将不胜感激!谢谢!以下是代码段:

为简化起见,ListView的ItemTemplate为:

 <DataTemplate>
      <local:MyUserControl1 />
 </DataTemplate>

和MyUserControl1只是一个空的UserControl:

public sealed partial class MyUserControl1 : UserControl
{
    public MyUserControl1()
    {
        this.InitializeComponent();
        this.Unloaded += MyUserControl1_Unloaded;
    }

    private void MyUserControl1_Unloaded(object sender, RoutedEventArgs e)
    {
        Debug.WriteLine("MyUserControl1_Unloaded...");
    }
}

1 个答案:

答案 0 :(得分:1)

通过默认的ListView,它将启用UI虚拟化。当你调用Clear()方法时,ListView会做一些特殊处理,它实际上没有删除这些项目(我相信你也发现了这种情况)。

您可以在实时可视树中看到ListView的ActualHeight(它设置为0)。这就是你无法在UI上看到listview的原因。

enter image description here

因此,解决方法是使用Remove()方法或listview.Itemsource=null。您还可以尝试禁用UI虚拟化。例如,使用StackPanel作为ItemsPanelTemplate。