1

我必须在 WPF 中的两个视图之间切换。我有一个 DataTemplate,它使用 ViewModels 来根据 ViewModel 推断要绘制的视图。简而言之:

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

一时兴起,我决定在视图之间快速切换.. WPF 应用程序的内存使用量飙升至 2gb。现在你可能会争辩说,在现实生活中,没有人会做我所做的事情。但我想知道如何释放分配的内存。肯定会调用 Unload,我已取消订阅任何事件处理程序。但这无济于事。DevExpress 或 WPF 是否具有可以告诉 .NET 处理用户控件的属性?我为 DevExpress 找到但做 zilch 的是:

DisposeOnWindowClosing
DestroyOnClosingChildren

创建的视图非常复杂,我重新组织了布局以节省内存。但同样增加。建议将非常感谢。

编辑:但是没有调用析构函数......

4

1 回答 1

1

这就是您如何处理嵌套在 ItemsControl 中的 UserControl(在本例中为 ListBox)

        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 是要从中查找项目的 ListBox 的 x:Name。
此外,这个 Dispose() 方法应该在 xaml.cs 中,并且应该在您不再需要该视图时调用。

高温下,

呸。

于 2012-07-18T12:21:00.483 回答