Я просто нашел огромную утечку памяти в простом приложении 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...");
}
}
Да, вы правы. Это разработанный механизм виртуализации 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) удаление всех элементов по одному (вместо очистки); 2) позволить listview.Itemsource = null. В элементе ListView сохраняется элемент, который я ожидаю, что все элементы будут удалены из памяти. – SimonFisher
@SimonFisher Я обращаюсь к коду на вашей теме MSDN, чтобы проверить. Я не могу воспроизвести эту проблему. Когда я вызываю метод clear() ',' Remove() ', элементы будут удалены. Я не могу найти его в отчете SnapShot. –