wpf userControl的子控件'取消订阅事件

时间:2016-10-07 23:22:46

标签: c# wpf event-handling

我希望有一个泛型(扩展)方法,它接受父控制并遍历其所有子控件并取消订阅它们的事件(如果有的话)。

问题 我正在密切关注内存消耗,当我创建一些基于wpf的形式,内存峰值,考虑到ui元素及其事件的数量,但是当表单关闭时,我希望内存得到释放,如在wpf中,我假设表单处理自动处理一旦关闭,所以GC应该清理并释放内存...但那就是没有发生的事情,因为我等了几分钟,并查看了诊断工具中的私有内存使用情况,这仍然是相同的。所以我想知道它没有完全处理/取消订阅事件等

1 个答案:

答案 0 :(得分:0)

我不能说是否有许多订阅事件会对性能产生负面影响,但我当然可以回答你的其他两个问题:

  1. 您可以使用以下扩展程序枚举所有子项:

    public static IEnumerable<T> GetVisualChildren<T>(this DependencyObject Parent) where T : DependencyObject
    {
        if (Parent != null)
        {
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(Parent); i++)
            {
                var Child = VisualTreeHelper.GetChild(Parent, i);
                if (Child != null && Child is T)
                    yield return (T)Child;
                foreach (var ChildOfChild in GetVisualChildren<T>(Child))
                    yield return ChildOfChild;
            }
        }
    }
    
    foreach (myControlInstance.GetVisualChildren<DependencyObject>())
    {
        //Unsubscribe events
    }
    
  2. 要取消订阅该对象的所有事件,请参阅此SO文章:

  3. How do I unsubscribe all handlers from an event for a particular class in C#?