Loaded-Ereignis eines WPF user control feuert mehr als einmal
Zur Umsetzung einer tab-basierten Umgebung, in WPF müssen wir wandeln unsere Formulare, Benutzersteuerelemente, aber wenn Sie dies tun, die Loaded
- Ereignis des Benutzersteuerelements wird genannt zwei mal.
Während der Suche auf das internet, um andere Menschen wies auch dieses Problem. Wie können wir sicherstellen, dass die loaded-Ereignis nur einmal aufgerufen wird? Weil, wenn es mehrfach aufgerufen wird, werden bei der Initialisierung unserer Kontrollen passiert mehrere Male.
- Ich habe versucht, zu reproduzieren, dies in einer leere .NET 4.0 WPF-Anwendung und das Loaded-Ereignis nur einmal abgefeuert. Haben Sie versucht, Blick auf den call-stack zu sehen, ob vielleicht etwas seltsam gehen auf in der .NET Framework, bevor Sie feuert das Loaded-Ereignis?
- Legen Sie Ihre Benutzer-Steuerelement in einem Registersteuerelement, und Sie werden in der Lage sein das Problem zu reproduzieren, beim Wechsel der tabs.
- Versuchen Sie es mit Seiten und Rahmen. Es ist viel einfacher und sauberer für die Gruppierung der Steuerelemente.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie in diesem blog, das Loaded-Ereignis wird ausgelöst, wenn jemals eine Kontrolle ist über die gerendert werden soll (d.h. Hinzugefügt, um die visuelle Struktur).
Gibt es einige Steuerelemente, die bewirkt, dass das Steuerelement geladen/entladen mehrfach. Zum Beispiel die native WPF-TabControl-Steuerelement rendert nur den Inhalt der ausgewählten Registerkarte. Also, wenn Sie eine neue Registerkarte wählen, wird der Inhalt der zuvor ausgewählten Registerkarte entladen wird. Wenn Sie auf zurück klicken, um die zuvor ausgewählten Registerkarte, dann ist es content neu geladen wird.
Einem umgehen, ist die Verwendung eines Boolean-flag ob Sie bereits initialisiert Ihrer Kontrolle, wie vorgeschlagen, die von anderen. Alternativ können Sie in der Lage sein zu verwenden, die Initialisiert Veranstaltung statt.
ItemsSource
binden mehrere Registerkarten und verwenden SieDataTemplate
zu ViewModel binden Sie auf die Registerkarte Ansichten. In meinem Fall ist nicht nur dieLoaded
- Ereignis erneut ausgelöst, sondern auch die constructor auf der Registerkarte Ansicht wieder aufgerufen. Es scheint, dass die WPF ist neu zu erstellen meinen Registerkarte Steuerung komplett jedes mal, wenn ich schalten Sie die Registerkarte.Ihre routed event-handler kann (und sollte) entfernen Sie sich von der
Loaded
Haken als das erste, was Sie tut.Legen Sie eine
loaded
fahne in der Falle, und, wenn das flag bereits gesetzt wurde, nichts.