我在silverlight控件上使用了多個Blend行爲和觸發器。我想知道是否有任何機制可以自動分離或確保在不再使用控件(即從可視化樹中移除)時爲行爲或觸發器調用OnDetaching()。爲Silverlight行爲自動調用OnDetaching()
我的問題是,由於其中一種行爲,存在受控制的內存泄漏。該行爲訂閱了OnAttached()覆蓋中某個長壽命對象上的事件,並且應該在OnDetaching()覆蓋中取消訂閱該事件,以便它可以成爲垃圾收集的候選對象。然而,當我從可視化樹中刪除控件時,OnDetaching()似乎永遠不會被調用......唯一能讓它發生的方法是在刪除控件之前明確地分離有問題的行爲,然後正確地進行垃圾收集。
現在我唯一的解決方案是在控制的代碼隱藏中創建一個公共方法,該方法可以通過並分離會導致垃圾收集問題的任何已知行爲。在從面板中刪除控件之前,需要知道要調用此代碼的客戶端代碼。我不太喜歡這種方法,所以我正在尋找一種自動的方式來做到這一點,我忽略了一個更好的建議。
public void DetachBehaviors()
{
foreach (var behavior in Interaction.GetBehaviors(this.LayoutRoot))
{
behavior.Detach();
}
//continue detaching all known problematic behaviors on the control....
}
謝謝!這種方法適合我們的需求。 – Jaans 2014-01-02 06:16:00