Saya telah membuat kontrol pengguna WPF khusus yang dimaksudkan untuk digunakan oleh pihak ketiga. Kontrol saya memiliki anggota pribadi yang dapat dibuang, dan saya ingin memastikan bahwa metode pembuangannya akan selalu dipanggil setelah jendela / aplikasi yang memuatnya ditutup. Namun, UserControl tidak dapat dibuang. Saya mencoba mengimplementasikan antarmuka IDisposable dan berlangganan event Unloaded tetapi tidak ada yang dipanggil ketika aplikasi host ditutup. Jika memungkinkan, saya tidak ingin bergantung pada konsumen dalam kendali saya mengingat untuk memanggil metode Buang tertentu.
public partial class MyWpfControl : UserControl
{
SomeDisposableObject x;
// where does this code go?
void Somewhere()
{
if (x != null)
{
x.Dispose();
x = null;
}
}
}
Satu-satunya solusi yang saya temukan sejauh ini adalah berlangganan acara Dispatcher ShutdownStarted. Apakah ini pendekatan yang masuk akal?
this.Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted;
Jawaban:
Posting blog yang menarik di sini:
http://geekswithblogs.net/cskardon/archive/2008/06/23/dispose-of-a-wpf-usercontrol-ish.aspx
Itu menyebutkan berlangganan Dispatcher.ShutdownStarted untuk membuang sumber daya Anda.
sumber
Dispatcher.ShutdownStarted
acara dipecat hanya pada akhir aplikasi. Layak untuk memanggil logika disposing hanya ketika kontrol tidak lagi digunakan. Secara khusus ia membebaskan sumber daya ketika kontrol digunakan berkali-kali selama runtime aplikasi. Jadi solusi ioWint lebih disukai. Berikut kodenya:sumber
Anda harus berhati-hati menggunakan destruktor. Ini akan dipanggil di utas GC Finalizer. Dalam beberapa kasus, sumber daya yang mungkin tidak disukai oleh pembebasan Anda pada utas yang berbeda dari tempat pembuatannya.
sumber
Saya menggunakan Perilaku Interaktivitas berikut untuk menyediakan acara pembongkaran ke WPF UserControls. Anda dapat menyertakan perilaku di UserControls XAML. Jadi, Anda dapat memiliki fungsionalitas tanpa menempatkan logika di setiap UserControl.
Deklarasi XAML:
Penangan CodeBehind:
Kode Perilaku:
sumber
e.Cancel
masih salah saat mencapaiWindowClosingHandler
delegasi Anda ) ?. Kontrol Anda akan "diturunkan" dan jendela masih terbuka. Saya pasti akan melakukan ini diClosed
acara, bukan diClosing
satu acara.Skenario saya sedikit berbeda, tetapi maksudnya sama saya ingin tahu kapan jendela induk hosting kontrol pengguna saya ditutup / ditutup sebagai Tampilan (yaitu kontrol pengguna saya) harus memanggil penyaji oncloseView untuk menjalankan beberapa fungsi dan melakukan pembersihan. (nah kami mengimplementasikan pola MVP pada aplikasi WPF PRISM).
Saya baru saja membayangkan bahwa dalam acara Loaded dari usercontrol, saya dapat menghubungkan metode ParentWindowClosing saya ke acara Parent windows Closing. Dengan cara ini, Usercontrol saya bisa waspada ketika jendela Induk ditutup dan bertindak sesuai dengan itu!
sumber
Saya pikir bongkar disebut semua tetapi sulit ada di 4.7. Tetapi, jika Anda bermain-main dengan versi .Net yang lebih lama, coba lakukan ini dalam metode pemuatan Anda:
Saya tidak berpikir versi lama akan membongkar sampai pemuatan ditangani. Hanya memposting karena saya melihat orang lain masih menanyakan pertanyaan ini, dan belum melihat ini diusulkan sebagai solusi. Saya hanya menyentuh .Net beberapa kali setahun, dan mengalami hal ini beberapa tahun yang lalu. Tapi, saya bertanya-tanya apakah sesederhana membongkar tidak dipanggil sampai pemuatan selesai. Sepertinya ini berfungsi untuk saya, tetapi sekali lagi di .Net yang lebih baru sepertinya selalu memanggil bongkar bahkan jika pemuatan tidak ditandai sebagai ditangani.
sumber
Sebuah UserControl memiliki Destructor, mengapa Anda tidak menggunakannya?
sumber