У меня есть элемент пользовательского интерфейса в моем приложении, где Panel используется для размещения одного из нескольких потенциальных пользовательских UserControls. Сама панель размещается в стандартизированном пользовательском контроле, в котором я использую что-то вроде немодального диалога, который я называю «панелью».
Метод, который я использую, - создать новый экземпляр стандартной панели, а затем с помощью логики создать один из нескольких дополнительных размещенных в нем элементов управления, используя Panel.Controls.Add(control)
. Затем я добавляю новую панель к элементу управления интерфейса в заданном месте, снова с помощью Control.Controls.Add(control)
, а затем control.BringToFront()
, чтобы максимизировать его положение z.
Все это работает хорошо, однако, когда приходит время скрыть панель и уничтожить ее, я не могу полностью избавиться от нее. Первоначально я просто использовал Control.Controls.Remove(control)
и для правильной меры установил для свойства Parent панели значение Nothing. Это привело бы к желаемому эффекту исчезновения панели, и я предположил, что теперь элемент управления не имеет ссылок, что GC будет им распоряжаться.
Однако я вижу, что этот элемент управления мгновенно мигает на экране, когда следующий внешний хост TabControl меняет вкладку, подразумевая, что он все еще где-то существует. Я могу подтвердить, что это не графическая проблема, и объект панели сохраняется, используя 'Make Object ID' окна VS Watch. (По крайней мере, я думаю, что это доказательство того, что без доступной для кода ссылки я все еще могу непосредственно видеть объект, и его свойства продолжают существовать.)
Я попытался заменить
Control.Controls.Remove(pane)
pane.Parent = Nothing
с
pane.Dispose()
GC.Collect()
где вызов Dispose, который я могу подтвердить, одновременно удаляет элемент управления из коллекции Controls его родителя и устанавливает для его свойства Parent значение Nothing, но, похоже, больше этого не делает. Оно сохраняется после принудительного сбора данных и время от времени вспыхивает на экране.
Все это приводит к моему первоначальному вопросу: как правильно удалить и полностью уничтожить элементы управления после того, как они выполнили свою задачу?