2017-01-07 2 views
-1

Я просто нашел огромную утечку памяти в простом приложении Windows Store, которое я разрабатываю.Почему не выгружено событие UserControl?

Оказалось, что я установил UserControl в ItemTemplate ListView и подключил событие Unloaded UserControl для отсоединения какого-либо обработчика событий.

Я ожидал, что когда товар ListView является очищены, то Unloaded события UserControl будет стрелять, но это не будет! Но когда я удалил предметы один за другим, событие UserControl должно завершиться как ожидается. Unloaded.

Может ли кто-нибудь дать мне совет по этому поводу? Или где я должен поместить код очистки, кроме того, чтобы подключить событие Unloaded. Любая идея была бы оценена! спасибо! Ниже приведен фрагмент кода:

Чтобы упростить, то ItemTemplate из ListView является:

<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

По ListView по умолчанию, он будет включить виртуализацию пользовательского интерфейса. Когда вы вызываете метод Clear(), ListView будет выполнять некоторые специальные процедуры, он фактически не удаляет эти элементы (я считаю, что вы также нашли эту ситуацию).

Вы можете увидеть ActualHeight ListView в живом визуальном дереве (оно установлено 0). Вот почему вы не видите список в пользовательском интерфейсе.

enter image description here

Таким образом, обходной путь заключается в использовании Remove() метод или listview.Itemsource=null. Вы также можете отключить виртуализацию пользовательского интерфейса. Например, используя StackPanel в качестве ItemsPanelTemplate.

+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) удаление всех элементов по одному (вместо очистки); 2) позволить listview.Itemsource = null. В элементе ListView сохраняется элемент, который я ожидаю, что все элементы будут удалены из памяти. – SimonFisher

+0

@SimonFisher Я обращаюсь к коду на вашей теме MSDN, чтобы проверить. Я не могу воспроизвести эту проблему. Когда я вызываю метод clear() ',' Remove() ', элементы будут удалены. Я не могу найти его в отчете SnapShot. –

 Смежные вопросы

  • Нет связанных вопросов^_^