2017-01-07 13 views
-1

私は開発している単純なWindowsストアアプリで膨大なメモリリークを検出しました。UserControlのUnloadedイベントが発生しないのはなぜですか?

ListViewのItemTemplateにUserControlを配置し、UserControlのUnloadedイベントをフックして、いくつかのイベントハンドラを切り離すことが判明しました。

ListViewの項目がである場合、がクリアされていると、UserControlのUnloadedイベントが発生することが予想されますが、そうではありません。しかし、のアイテムを1つずつ削除すると、UserControlのUnloadedイベントが期待どおりに起動します。

これについて私は何かアドバイスできますか?または、Unloadedイベントをフックする以外に、クリーンアップコードをどこに置くべきですか?任意のアイデアをいただければ幸いです!どうも!

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

とMyUserControl1はちょうど空のUserControlです:

が簡素化されるためには、リストビューのItemTemplateがある:デフォルトのリストビューでは、それは意志

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

以下のコードは、 UI仮想化を有効にします。 Clear()メソッドを呼び出すと、ListViewはいくつかの特別な処理を行いますが、実際にはこれらのアイテムを削除していません(この状況が見つかったと思います)。

ListViewのActualHeightは、ライブビジュアルツリー(0に設定されています)に表示されます。そのため、UIでlistviewを見ることができません。

enter image description here

だから、この問題を回避するには、Remove()方法やlistview.Itemsource=nullを使用することです。また、UIの仮想化を無効にすることもできます。たとえば、ItemsPanelTemplateとしてStackPanelを使用します。

+0

はい、正しいです。これは、ListView UI仮想化の設計メカニズムです。私はui仮想化を引き続き使用し、キャッシュサイズを制御するソリューションを見つけました。これはmsdnのスレッドです:https://social.msdn.microsoft.com/Forums/en-US/92f76519-f139-4c94-ae5e-630f0abda66e/memory-leak-with-listview-ui-virtualization?forum = wpdevelop – SimonFisher

+0

問題はまだあります。私は両方の方法を試みました:1)(削除の代わりに)1つずつすべての項目を削除する; 2)let listview.Itemsource = null。 ListViewによって保持されているアイテムがまだあります。これは、すべてのアイテムがメモリから削除されることを期待しています。 – SimonFisher

+0

@SimonFisherテストするMSDNスレッドのコードを参照します。この問題は再現できません。 'Clear()'、 'Remove()'メソッドを呼び出すと、その項目は削除されます。私はSnapShotレポートでそれを見つけることができません。 –

関連する問題