Freigeben über


Objektlebensdauer-Ereignisse

In diesem Thema werden die spezifischen WPF-Ereignisse beschrieben, die Phasen in einer Objektlebensdauer der Erstellung, Verwendung und Zerstörung kennzeichnen.

Voraussetzungen

In diesem Thema wird davon ausgegangen, dass Sie Abhängigkeitseigenschaften aus der Perspektive eines Anwenders vorhandener Abhängigkeitseigenschaften für Windows Presentation Foundation (WPF)-Klassen verstehen und das Thema Übersicht über Abhängigkeitseigenschaften gelesen haben. Um den Beispielen in diesem Thema zu folgen, sollten Sie auch XAML verstehen (siehe XAML in WPF-) und wissen, wie WPF-Anwendungen geschrieben werden.

Objektlebensdauer-Ereignisse

Alle Objekte in verwaltetem Microsoft .NET Framework-Code durchlaufen einen ähnlichen Satz von Lebensphasen, Erstellung, Verwendung und Zerstörung. Viele Objekte haben auch eine Finalisierungsphase, die im Zuge der Zerstörungsphase auftritt. WPF-Objekte, genauer gesagt die visuellen Objekte, die WPF als Elemente identifiziert, weisen auch eine Reihe allgemeiner Phasen der Objektlebensdauer auf. Die WPF-Programmierungs- und Anwendungsmodelle machen diese Phasen als Eine Reihe von Ereignissen verfügbar. Es gibt vier Haupttypen von Objekten in WPF in Bezug auf Lebenszeitereignisse; Elemente im Allgemeinen, Fensterelemente, Navigationshosts und Anwendungsobjekte. Fenster und Navigationshosts befinden sich auch innerhalb der größeren Gruppierung von visuellen Objekten (Elemente). In diesem Thema werden die Lebensdauerereignisse beschrieben, die allen Elementen gemeinsam sind. Danach werden spezifischere Ereignisse vorgestellt, die für Anwendungsdefinitionen, Fenster oder Navigationshosts gelten.

Allgemeine Lebenszeitereignisse für Elemente

Jedes WPF-Framework-Element (die Objekte, die von FrameworkElement oder FrameworkContentElementabgeleitet werden) weist drei allgemeine Lebensdauerereignisse auf: Initialized, Loadedund Unloaded.

Initialisiert

Initialized wird zuerst ausgelöst und entspricht in etwa der Initialisierung des Objekts durch den Aufruf seines Konstruktors. Da das Ereignis als Reaktion auf die Initialisierung erfolgt, stellen Sie sicher, dass alle Eigenschaften des Objekts festgelegt sind. (Eine Ausnahme sind Ausdrücke, z. B. dynamische Ressourcen oder Bindungen; diese bleiben unausgewertet.) Als Folge der Anforderung, dass alle Eigenschaften festgelegt werden, erscheint die Reihenfolge, in der die Sequenz der Initialized durch geschachtelte im Markup definierte Elemente ausgelöst wird, zuerst in der Reihenfolge der tiefsten Elemente in der Elementstruktur und dann übergeordnete Elemente in Richtung des Stamms. Diese Reihenfolge liegt daran, dass es sich bei den übergeordneten und untergeordneten Beziehungen um Eigenschaften handelt, und daher kann das übergeordnete Element die Initialisierung erst melden, wenn die untergeordneten Elemente, die die Eigenschaft ausfüllen, ebenfalls vollständig initialisiert worden sind.

Wenn Sie Handler als Reaktion auf das Initialized-Ereignis schreiben, müssen Sie berücksichtigen, dass es keine Garantie dafür gibt, dass alle anderen Elemente in der Baumstruktur (entweder logische oder visuelle Struktur) rund um die Stelle, an der der Handler angefügt ist, insbesondere die übergeordneten Elemente, bereits erstellt wurden. Membervariablen können null sein oder Datenquellen sind möglicherweise noch nicht durch die zugrunde liegende Bindung, sogar auf Ausdrucksebene, befüllt worden.

Geladen

Loaded wird als Nächstes ausgelöst. Das Loaded-Ereignis wird vor dem endgültigen Rendering ausgelöst, aber nachdem das Layoutsystem alle erforderlichen Werte für das Rendern berechnet hat. Loaded bedeutet, dass der logische Baum, in dem ein Element enthalten ist, abgeschlossen und mit einer Präsentationsquelle verbunden ist, die den HWND und die Renderingoberfläche bereitstellt. Die Standard-Datenbindung (Bindung an lokale Quellen, z. B. andere Eigenschaften oder direkt definierte Datenquellen) wird vor Loadederfolgt sein. Die asynchrone Datenbindung (externe oder dynamische Quellen) könnte aufgetreten sein, aber aufgrund ihrer asynchronen Natur kann nicht garantiert werden, dass sie aufgetreten ist.

Der Mechanismus, mit dem das Loaded-Ereignis ausgelöst wird, unterscheidet sich von Initialized. Das Initialized-Ereignis wird Element für Element erhoben, ohne eine direkte Koordination durch einen abgeschlossenen Elementbaum. Im Gegensatz dazu wird das Loaded-Ereignis im Rahmen einer koordinierten Anstrengung im gesamten Elementbaum (konkret im logischen Baum) ausgelöst. Wenn sich alle Elemente im Baum in einem Zustand befinden, in dem sie als geladen betrachtet werden, wird das Ereignis Loaded zuerst für das Stammelement ausgelöst. Das Loaded-Ereignis wird dann nacheinander für jedes Kind-Element ausgelöst.

Anmerkung

Dieses Verhalten kann oberflächlich dem Tunneln für ein routingfähiges Ereignis ähneln. Es werden jedoch keine Informationen von Ereignis zu Ereignis übertragen. Jedes Element hat stets die Gelegenheit, das Ereignis Loaded zu behandeln, und das Markieren der Ereignisdaten als behandelt hat keine Auswirkungen über dieses Element hinaus.

Entladen

Unloaded wird zuletzt ausgelöst und entweder von der Präsentationsquelle oder dem entfernten visuellen übergeordneten Element initiiert. Wenn Unloaded ausgelöst und behandelt wird, ist das Element, das das übergeordnete Element der Ereignisquelle ist (wie durch Parent Eigenschaft bestimmt) oder ein bestimmtes Element in den logischen oder visuellen Strukturen möglicherweise bereits nicht festgelegt, was bedeutet, dass Datenbindung, Ressourcenverweise und Formatvorlagen möglicherweise nicht auf ihren normalen oder letzten bekannten Laufzeitwert festgelegt werden.

Anwendungsmodell-Elemente für Lebenszyklusereignisse

Basierend auf den allgemeinen Lebensdauerereignissen für Elemente handelt es sich um die folgenden Anwendungsmodellelemente: Application, Window, Page, NavigationWindowund Frame. Diese erweitern die allgemeinen Lebenszeitereignisse mit zusätzlichen Ereignissen, die für ihren spezifischen Zweck relevant sind. Diese werden an den folgenden Orten ausführlich diskutiert:

Siehe auch