Ho creato un controllo utente WPF personalizzato che è destinato ad essere utilizzato da una terza parte. Il mio controllo ha un membro privato che è usa e getta, e mi piacerebbe assicurarmi che il suo metodo di eliminazione venga sempre chiamato una volta chiusa la finestra o l'applicazione contenente. Tuttavia, UserControl non è usa e getta. Ho provato a implementare l'interfaccia IDisposable e ad iscrivermi all'evento Unloaded, ma nessuno dei due viene chiamato quando l'applicazione host si chiude. Se possibile, non voglio fare affidamento sui consumatori del mio controllo ricordando di chiamare un metodo Dispose specifico.Smaltimento dei controlli utente WPF
public partial class MyWpfControl : UserControl
{
SomeDisposableObject x;
// where does this code go?
void Somewhere()
{
if (x != null)
{
x.Dispose();
x = null;
}
}
}
L'unica soluzione che ho trovato finora è iscriversi all'evento ShutdownStarted del Dispatcher. È un approccio ragionevole?
this.Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted;
Cosa sull'evento a vuoto di controllo utente? – akjoshi
@akjoshi: MSDN afferma che: L'evento non scaricato non può essere generato affatto.E potrebbe anche essere attivato più di una volta, cioè quando l'utente cambia tema. – Dudu
Mentre è possibile implementare l'interfaccia IDisposable sul proprio controllo utente, non è garantito che la terza parte chiamerà il metodo di smaltimento dell'implementazione del modello Dispose. Se stai mantenendo le risorse native (ad esempio un flusso di file), dovresti considerare l'utilizzo di un finalizzatore. – Philippe