Wann kann ich entsorgen, eine IDisposable-WPF-Steuerelement z.B. WindowsFormsHost?
WPF WindowsFormsHost-Steuerelement erbt von IDisposable.
Wenn ich eine komplexe WPF visual tree enthält einige der oben steuert, was Ereignis oder Methode kann ich verwenden, um anzurufen IDispose beim Herunterfahren?
Wenn Sie sagen, 'beim Herunterfahren' meinst du, dass die app geschlossen wird? Die Steuerung ist nicht mehr sichtbar? Ein Dialogfeld wird geschlossen?
Hier meine ich Herunterfahren der Anwendung, aber ich bin auch daran interessiert, den dialog schließen Fall.
Hier meine ich Herunterfahren der Anwendung, aber ich bin auch daran interessiert, den dialog schließen Fall.
InformationsquelleAutor morechilli | 2008-10-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bei beenden der Anwendung gibt es nichts, was Sie tun müssen, um die ordnungsgemäße Entsorgung des WindowsFormsHost. Seit es leitet sich aus HwndHost der Entsorgung behandelt wird, wenn der Dispatcher Herunterfahren. Wenn du den Reflektor sehen Sie, dass, wenn HwndHost initialisiert wird, erstellt es eine WeakEventDispatcherShutdown.
Wenn Sie es in einem dialog die beste, die ich vorschlagen kann, ist das überschreiben OnClosed und entsorgen Sie den Host, da sonst die HwndHost hängen, um, bis, bis der Dispatcher Herunterfahren.
Einen einfachen Weg, um zu testen, wenn dispose aufgerufen wird, ist die Ableitung einer eigenen Klasse von WindowsFormsHost und spielen, um mit verschiedenen Situationen. Legen Sie einen Haltepunkt im entsorgen und sehen, wenn es aufgerufen wird.
InformationsquelleAutor Todd White
Gebäude von Todd ' s Antwort, die ich kam mit dieser generischen Lösung für jedes WPF-Steuerelement gehostet wird, indem Sie ein Fenster und will garantieren, Entsorgung, wenn das Fenster geschlossen ist.
(Natürlich, wenn Sie vermeiden können, Erben von IDisposable tun, aber manchmal können Sie einfach nicht)
Dispose aufgerufen wird, wenn der erste übergeordnete Fenster in der Hierarchie ist geschlossen.
(Mögliche Verbesserung - die event-handling, um das schwache Muster)
hängt von der Kontrolle - in der Regel Sie haben nichts, aber leider gibt es Sonderfälle siehe mein Kommentar auf deine Antwort
Dies wird nicht für diejenigen, die hosting-WPF in Windows Forms-Anwendung. Es gibt mehr kompatible Möglichkeiten, um alternativ auch Haken bis zu der damit verbundenen WinForms-close-Ereignisse für die primäre Form aber, wie Sie es haben, wäre dies nicht ausreichend für eine weitgehend wiederverwendbare WPF control library. Auch die Reinigung nur, wenn das Hauptfenster geschlossen ist, ist vermutlich nicht genau das, was die meisten Entwickler wünschen würden. Stattdessen ist es wohl eher wünschenswert, zu tun, aufzuräumen, wenn das erste Fenster/Seite, bis der Baum aus dem Umfang (nicht unbedingt, wenn es geschlossen ist).
Vielen Dank - Klingt wie Sie haben einige nützliche Ideen - wenn Sie Lust haben auf die Abgabe einer Antwort beschreibt eine bessere und mehr Allgemeine Lösung ist, dann werde ich gerne deaktivieren Sie diese beantworten und berücksichtigen Ihre.
InformationsquelleAutor morechilli
WPF-Steuerelemente nicht die IDisposable-Schnittstelle implementieren, weil Sie haben nichts zu entsorgen (Keine Griffe zu reinigen, keine nicht verwalteten Speicher zu release). Alles, was Sie tun müssen ist, stellen Sie sicher, dass Sie haben noch keine Verweise auf die Bedienelemente und den GC zu reinigen.
Daher WPF beschäftigt weak event patterns, um sicherzustellen, dass die Kontrollen können von der garbage Collection freigegeben. Dies ist das Muster, die Sie implementieren müssen, um sicherzustellen, clean-up, nicht IDisposable.
Wenn Sie etwas zu entsorgen, dann implementieren Sie IDisposable, wenn nicht, dann nicht. Aber nicht umzusetzen, bis Sie tun.
Es scheint, dass die weak event pattern könnte noch ein problem darstellen, in Situationen, in denen Sie die swap einen vorhandenen Steuerungs-und wollen sicherstellen, dass alle Ereignisse auf, die alte Steuerung und vorgeführt von Steuern zu unhooked, so dass Sie aufhören, die Verarbeitung von Ereignissen. In unseren Experimenten scheint es, dass diese Veranstaltungen weiterhin auf das Feuer. Der Aufruf von Dispose dienen diese Veranstaltung Bereinigung Zweck als auch in WinForms.
InformationsquelleAutor Pop Catalin
Brauchen Sie nicht zu entsorgen-Steuerelemente beim schließen einer form, die API wird es automatisch für Sie tun, wenn das Steuerelement in der visual tree der form ( wie ein Kind von der einen oder anderen form-Steuerelement im Formular)
Wenn Dispose aufgerufen wird auf die wichtigsten wpf-Fenster, alle seine Kinder entsorgt werden, (und so weiter). Ihre WFH Kontrolle sollte entsorgt werden, ohne dass Sie zusätzliche Arbeit auf Ihrem Teil.
Da weder die wpf-Anwendung die Klasse, noch das wpf-Fenster-Klasse erbt von der IDisposable-das scheint unwahrscheinlich - ich glaube wpf ist immun gegen die entsorgen müssen, bis Sie ziehen in winforms.
InformationsquelleAutor Pop Catalin