我在 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....
}