Размещение объекта в элементе управления wpf - PullRequest
3 голосов
/ 21 июня 2011

Я использую объект, который реализует IDisposable в моем пользовательском элементе управления WPF. Как я могу гарантировать, что этот объект будет удален, когда элемент управления GC? В классе Control нет метода Dispose () или какого-либо другого метода, который я могу переопределить для удаления своего объекта.

Ответы [ 4 ]

1 голос
/ 25 июня 2011

Я думаю, что если вы следуете шаблону проектирования MVVM, тогда ресурсы должны храниться в модели или модели представления.

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

0 голосов
/ 21 июня 2011

Если вы используете объект, который необходимо утилизировать, попробуйте использовать метод Application.Shutdown , чтобы освободить ресурсы при завершении работы, или попробуйте событие Unloaded , чтобы освободить ресурсы при удалении элемента управления из визуального дерева. Возможно, вам придется использовать комбинацию двух методов.

Попробуйте посмотреть этот вопрос, чтобы увидеть, поможет ли это

0 голосов
/ 21 июня 2011

Я имел дело с этим прошлой ночью.То есть мне нужно было вызвать dispose для объекта в UserControl.Я думаю, у вас есть два варианта.

Я добавил экземпляр BackgroundWorker в WPF UserControl.Это может или не может быть хорошей идеей, но что угодно.Для каждого элемента UserControl необходимо запустить только один экземпляр BackgroundWorker.Итак, я инициализирую BackgroundWorker как ноль.Когда мне нужно использовать BackgroundWorker, я проверяю, имеет ли он значение null, а затем создаю новый экземпляр, чтобы он выполнял свою работу.Затем я удаляю его в событии завершения работника и возвращаю ему значение null.

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

Закрытие события WPFWindow (или Unload, или что угодно) вызывает пользовательскую функцию выпуска в вашем UserControl.Эта специальная функция выпуска делает свою работу.

Итак, нет действительно хорошего одного размера, подходящего для любого решения вашей проблемы.Требуется больше дизайна и продуманных функций, которые требуют утилизации, потому что, как правило, WPF этого не требует.Как правило, WPF требует, чтобы вы установили пустые элементы.(Может ли UserControl.Unload вызываться, когда вы устанавливаете UserControl на ноль? До этого не думали об этом, но если это так, то это будет правильный ответ.)

0 голосов
/ 21 июня 2011

Финализатор должен вызвать Dispose, если он еще не был вызван.Если вы имеете дело с типом .NET, то можете быть уверены, что это так.Финализатор будет вызван, когда объект GC'd, и вы будете в порядке.

Это типично для элементов управления, таких как Picturebox, которые отображают Bitmap.Если вы часто не обмениваетесь этим растровым изображением (в этом случае вы должны им распоряжаться), вы, вероятно, можете обойтись без излишней осторожности.Если у вас есть много объектов, которые реализуют IDisposable, которые больше не нужны, но у вас могут быть живые ссылки, которые лежат в течение относительно долгого времени, тогда вы должны быть более активными и создать схему, чтобы эти вещи были очищены так же детерминистическивозможный.

...