2013-03-19 2 views
0

Я внедрил WPF UserControl. Эта реализация включает деструктор.Пользовательский контроль не завершается при удалении из элемента управления вкладки

Если я сделаю эту часть управления окном, а затем уничтожу это окно, а затем принудительно собрал сборку мусора (GC.Collect()), вызывается деструктор.

Если добавить этот элемент управления к TabItem, который, в свою очередь добавляют к TabControl, а затем удалить этот TabItem из TabControl, а затем заставить мусора (GC.Collect()), деструктор не вызывается.

Разъяснение:

Вот код, который добавляет вкладку пункт:

  TabItem tabItem = new TabItem(); 
      tabItem.Header = "User"; 
      UserControl1 userControl1 = new UserControl1(); 
      tabItem.Content = userControl1; 
      userControl1.Width = Double.NaN; 
      userControl1.Height = Double.NaN; 
      userControl1.HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch; 
      userControl1.VerticalAlignment = System.Windows.VerticalAlignment.Stretch; 
      tc1.Items.Add(tabItem); 

А вот код для его удаления:

  TabItem item = tc1.SelectedItem as TabItem; 
      if (item != null) 
      { 
       item.Content = null; 
       tc1.Items.Remove(item); 
      } 

Учитывая, что больше не должно быть любые ссылки на TabItem или UserControl1, я ожидаю, что деструктор будет вызван для UserControl1.

Это, очевидно, не так, поэтому мой следующий вопрос: почему?

+0

Возможный дубликат [TabControl.Items.Remove (TabItem) не освобождает память, используемую TabItem] (http://stackoverflow.com/questions/3167943/tabcontrol-items-removetabitem-does-not-free-memory- used-by-tabitem) –

+1

Лучше описать «сбор мусора», потому что это может означать несколько вещей. Используйте C#, чтобы избежать путаницы. –

+1

Удаление элементов управления из контейнера * не * приводит к их уничтожению. Идея состоит в том, что вы можете удалить элемент управления из одного контейнера и немедленно добавить его в другой контейнер. Поэтому вам необходимо вручную обработать уничтожающие элементы управления, которые вам больше не нужны, после их удаления из контейнера. –

ответ

1

Вы не должны полагаться на деструкторы или использовать их, если только ваш класс не владеет неуправляемым ресурсом.

В вашем примере что-то, как и подписчик событий, может содержать ссылку на TabItem, предотвращая сбор мусора.

+0

Я добавил примерный код выше. Я добавил никаких обработчиков событий, но по-прежнему кажется, что существует скрытая ссылка. – user2187743

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