Bir Silverlight denetiminde birkaç Blend davranışı ve tetikleyici kullanıyorum. Otomatik olarak ayırma veya kontrolün artık kullanılmadığında (ör. Görsel ağaçtan kaldırıldığında) bir davranış veya tetikleme için OnDetaching() çağrıldığından emin olmak için herhangi bir mekanizma olup olmadığını merak ediyorum.Silverlight Davranışları için OnDetaching() otomatik çağırma
Benim sorunum, davranışlardan biri nedeniyle, denetim ile yönetilen bir bellek sızıntısı olmasıdır. Davranış, OnAttached() öğesindeki bazı uzun ömürlü nesnelerdeki bir olaya abone olur ve OnDetaching() uygulamasındaki aboneliği iptal eder ve böylece çöp toplama için aday olabilir. Ancak, Visual Tree'den kontrolü kaldırdığımda OnDetaching() asla çağrılmayacak gibi görünüyor ... ben bunu elde etmek için tek yol kontrol kaldırmadan ÖNCE sorunlu davranışları açıkça ayırmak ve sonra düzgün toplanan çöp olduğunu .
Şu anda tek çözümüm, denetim için kodun arkasında, çöp toplama sorunlarına yol açabilecek bilinen davranışları çözebilen ve ayırabilen bir genel yöntem oluşturmaktı. Denetimin panelden kaldırılmasından önce bunu çağırmayı bilmek istemci koduna kalmış olur. Bu yaklaşımı gerçekten beğenmedim, bu yüzden bunu yaptığım veya daha iyi bir öneride bulunmanın otomatik bir yolunu arıyorum. Eğer gerçekten bu durumda gerekenler
public void DetachBehaviors()
{
foreach (var behavior in Interaction.GetBehaviors(this.LayoutRoot))
{
behavior.Detach();
}
//continue detaching all known problematic behaviors on the control....
}
Teşekkürler! Bu yaklaşım ihtiyaçlarımız için iyi çalıştı. – Jaans