我在silverlight控件上使用了几个Blend行为和触发器.我想知道是否有任何机制可以自动分离或确保在不再使用控件时(即从可视树中删除)为行为或触发器调用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....
}
silverlight garbage-collection memory-leaks attachedbehaviors expression-blend