2014-07-08 4 views
9

In WPF und WinRT ist es bekannt, dass Verhaltensweisen ihre Detach-Methode nicht zuverlässig aufrufen. Die einzige Möglichkeit, einen Speicherverlust zu vermeiden, besteht darin, das Ereignis Unloaded des AssociatedObject zu abonnieren und alle Ereignisse zu entfernen (example).Gibt es eine sichere Möglichkeit, Verhaltensweisen ohne Nebenwirkungen zu lösen/zu entfernen?

Bisher funktioniert es.

Aber ich erkannte (wie auch jemand anders, der den Blog-Eintrag, den ich verlinkt habe), dass auf diese Weise entladene Verhaltensweisen nie wieder angebracht werden. Nehmen Sie zum Beispiel ein MenuFlyout. Wenn einem MenuFlyoutItem ein Verhalten zugeordnet ist, wird es entladen, wenn MenuFlyoutItem geschlossen wird. Wenn Sie das Menü erneut öffnen, wird es nicht erneut angehängt.

Dies geschieht auch mit anderen Benutzersteuerelementen. Ich "verliere" Verhaltensweisen beim Navigieren in meiner WinRT App von einer Seite zur nächsten und wieder zurück, obwohl alle Controls neu erstellt werden. Ich sehe nicht, wie ich sie in einer WinRT-App verwenden kann, in der viele Steuerelemente durch Navigieren neu erstellt werden.

Ist eine Lösung bekannt?

+0

Vielleicht bin ich etwas fehlt, aber wenn Sie auf Unload sind Abnehmen, würden Sie nicht nur haben, auch auf Last legen? – McGarnagle

+0

@McGarnagle Danke für deinen Kommentar. Da meine Verhaltensweisen in Xaml erstellt werden, habe ich keine Kontrolle über die Zeit, die sie angehängt sind. Das Halten eines Verweises, um sie zu einem späteren Zeitpunkt erneut manuell anzuhängen, könnte selbst die Ursache eines Speicherlecks sein. Außerdem bin ich mir nicht sicher, wie ich das tun würde, um ein neues Verhalten im Code zu erstellen. – Amenti

+0

Es scheint mir, dass Sie zwischen zwei Fällen unterscheiden müssen. Erstens, wenn Ihre Objekte nach dem Entladen im Speicher gehalten und bei der nächsten Verwendung wiederverwendet werden. Zweitens, wo entladene Objekte verworfen werden und neue später erstellt werden. Im ersten Fall müssen Sie weiterhin dem Ereignis "Loaded" lauschen. Im zweiten Fall würde dies dazu führen, dass die alten Objekte nicht erkannt werden (Speicherleck), daher sollten Sie sich vom Ereignis "Loaded" lösen. – McGarnagle

Antwort

Verwandte Themen