如何处置由DataTemplate中创建用户控件的(How to dispose of userco

2019-10-17 01:04发布

我必须在WPF两个视图之间切换。 我有一个使用的ViewModels推断取决于视图模型绘制该视图一个DataTemplate。 简而言之:

<DataTemplate DataType="{x:Type ..:RedScreenViewModel}">
<...:RedScreenViewModel/>
</DataTemplate>

心血来潮,我决定视图之间快速切换..和WPF应用程序的内存使用量猛增至2GB。 现在你可能会说,在现实生活中,没有人会做什么,我做到了。 但我想知道如何释放已分配的内存。 卸载绝对叫,我已经从任何事件处理程序退订。 但它并不能帮助。 是否DevExpress的或WPF有一个属性,它可以告诉.NET处置UserControl的? 那些我发现的DevExpress但做小人物有:

DisposeOnWindowClosing
DestroyOnClosingChildren

该视图创建是非常复杂的,我已经在努力节省内存改组布局。 但是,同样的增长。 建议将是巨大的感谢。

编辑:析构函数不叫然而...

Answer 1:

这是你如何处置嵌套一个ItemsControl内部的用户控件(在这种情况下:一个列表框)

        public void Dispose()
        {
            if (this.listb != null)
            {
                for (int count = 0; count < this.listb.Items.Count; count++)
                {
                    DependencyObject container = this.listb.ItemContainerGenerator.ContainerFromIndex(count);
                    UserControl userControl = container.GetVisualDescendent<UserControl>();
                    IDisposable controlToPotentiallyDispose = userControl as IDisposable;
                    if (controlToPotentiallyDispose != null)
                        controlToPotentiallyDispose.Dispose();
                    controlToPotentiallyDispose = null;
                }
            }
            if (this.ViewModel != null)
            {
                this.ViewModel.Dispose();
                this.ViewModel = null;
            }
            this.listb = null;
        }

需要注意的是数组listB是x:列表框从寻找项目的名称。
此外,该Dispose()方法应该是在xaml.cs应该叫做当你不需要的观点了。

HTH,

章。



文章来源: How to dispose of usercontrols created by DataTemplate