Я создал настраиваемый пользовательский элемент управления WPF, который предназначен для использования третьей стороной. У моего элемента управления есть закрытый член, который является одноразовым, и я хотел бы убедиться, что его метод удаления всегда будет вызываться после закрытия содержащего окно / приложение. Однако UserControl не является одноразовым. Я попытался реализовать интерфейс IDisposable и подписаться на событие Unloaded, но ни один из них не был вызван при закрытии основного приложения. Если это вообще возможно, я не хочу полагаться на то, что потребители моего контроля не забывают вызывать определенный метод Dispose.
public partial class MyWpfControl : UserControl
{
SomeDisposableObject x;
// where does this code go?
void Somewhere()
{
if (x != null)
{
x.Dispose();
x = null;
}
}
}
Единственное решение, которое я нашел до сих пор, - это подписаться на событие ShutdownStarted Dispatcher. Это разумный подход?
this.Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted;
Ответы:
Интересный пост в блоге здесь:
http://geekswithblogs.net/cskardon/archive/2008/06/23/dispose-of-a-wpf-usercontrol-ish.aspx
В нем упоминается подписка на Dispatcher.ShutdownStarted для удаления ваших ресурсов.
источник
Dispatcher.ShutdownStarted
событие запускается только в конце приложения. Логику утилизации стоит вызывать как раз тогда, когда управление выходит из употребления. В частности, он освобождает ресурсы при многократном использовании элемента управления во время выполнения приложения. Так что решение ioWint предпочтительнее. Вот код:источник
Будьте осторожны при использовании деструктора. Это будет вызвано в потоке GC Finalizer. В некоторых случаях освобождаемые ресурсы могут не понравиться размещению в другом потоке, отличном от того, в котором они были созданы.
источник
Я использую следующее поведение интерактивности, чтобы предоставить событие выгрузки для WPF UserControls. Вы можете включить поведение в XAML UserControls. Таким образом, вы можете иметь функциональность, не помещая логику в каждый элемент UserControl.
Объявление XAML:
Обработчик CodeBehind:
Код поведения:
источник
e.Cancel
все еще ложно, когда оно достигает вашегоWindowClosingHandler
делегата) ?. Ваш элемент управления будет «выгружен», а окно все равно будет открыто. Я бы определенно сделал это наClosed
мероприятии, а не наClosing
одном.Мой сценарий немного отличается, но намерение такое же, я хотел бы знать, когда родительское окно, в котором размещен мой пользовательский элемент управления, закрывается / закрывается, поскольку представление (то есть мой пользовательский элемент управления) должно вызывать презентаторов oncloseView для выполнения некоторых функций и выполнения очистки. (ну, мы реализуем шаблон MVP в приложении WPF PRISM).
Я только что понял, что в событии Loaded пользовательского элемента управления я могу подключить свой метод ParentWindowClosing к событию закрытия родительских окон. Таким образом мой пользовательский элемент управления может знать, когда родительское окно закрывается, и действовать соответственно!
источник
Я думаю, что выгрузка вызывается у всех, но в 4.7 существует. Но, если вы играете со старыми версиями .Net, попробуйте сделать это в своем методе загрузки:
Я не думаю, что старые версии выгружаются, пока загрузка не будет обработана. Просто отправляю, потому что я вижу, что другие все еще задают этот вопрос, и не видел в этом предложении решения. Я трогаю .Net только несколько раз в год, и столкнулся с этим несколько лет назад. Но мне интересно, так ли просто, как unload, который не вызывается до завершения загрузки. Похоже, это работает для меня, но опять же в более новой .Net кажется, что всегда вызывает unload, даже если загрузка не помечена как обработанная.
источник
У UserControl есть деструктор, почему бы вам не использовать его?
источник