Я заполняю ListBox с VirtualizationMode.Recycling
пользовательскими элементами управления UserControls:
<DataTemplate x:Key="MyDataTemplate">
<local:MyUserControl />
</DataTemplate>
И проблема в том, что при прокрутке пользователя перезапуск Listbox вызывает событие Unloaded
, но не конструктор на новый элемент, который переписал бы его, приводя к пустым MyUserControl
элементам в списке.
class MyUserControl : FrameworkElement
{
public MyUserControl()
{
Loaded += u_Loaded;
Unloaded += u_Unloaded;
SizeChanged += u_SizeChanged;
}
private void u_Unloaded(object sender, RoutedEventArgs e)
{
Loaded -= u_Loaded;
Unloaded -= u_Unloaded;
SizeChanged -= u_SizeChanged;
}
Если я исключаю событие Unloaded, это работает, но тогда нет способа предотвратить утечку памяти, отписавшись от SizeChanged
(и дополнительные события мыши в будущем).
Если я закомментирую строку Loaded -= u_Loaded;
, то рисование элемента будет работать, но тогда произойдет утечка памяти из-за сохранения этого события в проводном режиме?
Как правильно переписать все события при использовании режима виртуализации Recycling?