2014-12-18 5 views
2

У нас есть класс, который происходит из FrameworkElement и который не под нашим контролем. Этот класс регистрирует обработчики событий в методе OnInitialize.Как деинициализировать элемент FrameworkElement?

Что такое шаблон для правильной очистки этого класса, поскольку FrameworkElement не предоставляет аналог OnInitialize?

Он остается в корне, поскольку никакая его часть не удаляет EventHandler, вызывая утечку.

ответ

3

Нет такой вещи, как «деинициализация». Методы инициализации используются, когда невозможно полностью инициализировать объект в его конструкторе, поскольку он зависит от данных, которые недоступны во время построения. В этих случаях конструкция разбивается на две фазы: первый шаг выполняется в безпараметровом конструкторе, второй - в способе инициализации, например OnInitialize, после того, как внешние данные становятся доступными.

Что вы описываете - это удаление объекта, которое выполняется путем вызова метода объекта Dispose. Хорошо написанный класс должен очистить свои данные, освободить любые внешние ресурсы и освободить любые обработчики событий.

Визуальные элементы обычно имеют еще один шаг в их жизненном цикле, обрабатываемый методами OnLoad/OnUnload. Шаг загрузки возникает, когда элемент фактически помещается в представление XAML и подключается к другим элементам пользовательского интерфейса. Обработчики событий должны быть зарегистрированы в методе OnLoad и удалены в методе OnUnload.

Если элемент не имеет Dispose метод, вы можете быть в состоянии поднять событие Unload, чтобы заставить очистки, хотя это немного рубить:

control.RaiseEvent(new RoutedEventArgs(FrameworkElement.UloadedEvent)) 
+0

Класс в вопросе находится в библиотеке AvalonDock , Нет концептуальных документов, обосновывающих причину, по которой события не очищаются. – Portikus

+1

Окно стыковки должно создаваться только один раз для каждой формы. Учитывая, что докинг используется для основной формы приложения, это должно происходить только один раз в жизни приложения. Вы создаете много форм во время выполнения? Вы распоряжаетесь формами, повторно используете их или оставляете их собранными в мусор? –

+0

Мы создаем ViewModels (и их представления как привязывающие) по требованию. Так же, как Visual Studio не создает все возможные окна при запуске. LayoutContent имеет событие закрытия и защищенный OnClosing для поддержки этого. Профилирование показало нам, что закрытие окна корректно отображает наш ViewModel, но следующее скрытое «освобождение» LayoutDocumentPaneGroupControl терпит неудачу, так как оно все еще является активным обработчиком событий. Нет следа, что закрытие не поддерживается. – Portikus