Я внедрил 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.
Это, очевидно, не так, поэтому мой следующий вопрос: почему?
Возможный дубликат [TabControl.Items.Remove (TabItem) не освобождает память, используемую TabItem] (http://stackoverflow.com/questions/3167943/tabcontrol-items-removetabitem-does-not-free-memory- used-by-tabitem) –
Лучше описать «сбор мусора», потому что это может означать несколько вещей. Используйте C#, чтобы избежать путаницы. –
Удаление элементов управления из контейнера * не * приводит к их уничтожению. Идея состоит в том, что вы можете удалить элемент управления из одного контейнера и немедленно добавить его в другой контейнер. Поэтому вам необходимо вручную обработать уничтожающие элементы управления, которые вам больше не нужны, после их удаления из контейнера. –