Ich weiß, dass Sie Speicherlecks haben, wenn Sie ein Objekt für die angefügten Ereignisse der Maus registrieren. Deshalb müssen Sie WeakEvent pattern verwenden.Wie integrierte WPF-Steuerelemente ihre Ereignishandler für ein angehängtes Ereignis verwalten?
Ich habe ein Problem mit diesem Muster: Wenn Sie es verwenden möchten, können Sie Ihren Handler nicht im XAML-Code definieren.
Für mich bedeutet es, dass jeder Code wie folgt Lecks:
<SomeControl Mouse.MouseDown="MyHandler" />
Sofern Sie Ihre Handler explizit im Code entfernen (und ich bezweifle, dass irgendjemand das tut). Jetzt gibt es etwas, was ich nicht verstehe:
<Button Click="MyHandler" />
Dieser Code irgendwie irgendwo das Mouse.MouseDown Ereignis verwenden, um einen Klick auf den Button zu erkennen. Mit etwas Forschung mit Reflektor fand ich, dass dieses Ereignis MouseDown der UIElement-Klasse verwendet. Und wenn ich den Code von UIElement lese verstehe ich nicht: Es gibt keinen WeakEventManager!
Kann mir jemand erklären, wie UIElement Ereignisse von Mouse.MouseDown ohne Leck erhalten?
Ich stimme dir zu, aber Handler in XAML zu einem angehängten Ereignis (ich spreche nicht über Steuerelemente Ereignisse, sondern Ereignisse wie Mouse.MouseDown) kann undicht werden, weil es immer einen Verweis darauf gibt. Intern verwenden Button-Klasse Mouse.MouseDown-Ereignisse (UIElement, um spezifisch zu sein). Und ich weiß nicht, warum das nicht leckt. –
Guter Punkt. Angehängte Ereignisse sind externe Referenzen. –