Ich verwende mehrere Blend-Verhalten und Trigger auf einem Silverlight-Steuerelement. Ich frage mich, ob es einen Mechanismus für das automatische Lösen oder Sicherstellen gibt, dass OnDetaching() für ein Verhalten oder einen Auslöser aufgerufen wird, wenn das Steuerelement nicht mehr verwendet wird (d. H. Aus dem visuellen Baum entfernt).Automatisches Aufrufen von OnDetaching() für Silverlight-Verhalten
Mein Problem ist, dass es ein Speicherleck mit der Kontrolle, weil einer der Verhaltensweisen verwaltet wird. Das Verhalten subskribiert ein Ereignis für ein langlebiges Objekt in der OnAttached() - Überschreibung und sollte sich von diesem Ereignis in der OnDetaching() - Überschreibung abmelden, damit es ein Kandidat für die Garbage Collection werden kann. OnDetaching() scheint jedoch nie aufgerufen zu werden, wenn ich das Steuerelement aus dem visuellen Baum entferne. Die einzige Möglichkeit, dies zu erreichen, besteht darin, die problematischen Verhaltensweisen VOR dem Entfernen des Steuerelements explizit zu trennen und dann ordnungsgemäß zu sammeln .
Gerade jetzt meine einzige Lösung war eine öffentliche Methode in dem Code-Behind für die Steuerung zu schaffen, der durch gehen kann, und nehmen Sie alle bekannten Verhaltensweisen, die Garbage Collection zu Problemen führen würde. Es wäre Aufgabe des Client-Codes, dies vor dem Entfernen des Steuerelements aus dem Panel zu erfahren. Ich mag diesen Ansatz nicht wirklich, deshalb suche ich nach einem automatischen Weg, dies zu tun, den ich übersehe oder einen besseren Vorschlag.
public void DetachBehaviors()
{
foreach (var behavior in Interaction.GetBehaviors(this.LayoutRoot))
{
behavior.Detach();
}
//continue detaching all known problematic behaviors on the control....
}
Danke! Dieser Ansatz hat gut für unsere Bedürfnisse funktioniert. – Jaans