私は開発している単純な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...");
}
}
はい、正しいです。これは、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
問題はまだあります。私は両方の方法を試みました:1)(削除の代わりに)1つずつすべての項目を削除する; 2)let listview.Itemsource = null。 ListViewによって保持されているアイテムがまだあります。これは、すべてのアイテムがメモリから削除されることを期待しています。 – SimonFisher
@SimonFisherテストするMSDNスレッドのコードを参照します。この問題は再現できません。 'Clear()'、 'Remove()'メソッドを呼び出すと、その項目は削除されます。私はSnapShotレポートでそれを見つけることができません。 –