1

WPF で 2 つのビューを切り替える必要があります。ViewModels を使用して、ViewModel に応じて描画するビューを推測する DataTemplate があります。要するに:

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

気まぐれで、ビューをすばやく切り替えることにしました..そして、WPFアプリのメモリ使用量が最大2GBになりました。今、あなたは、実生活では私がしたことを誰もやらないだろうと主張するかもしれません. しかし、割り当てられたメモリを解放する方法を知りたいです。Unload は必ず呼び出されます。イベント ハンドラーからサブスクライブを解除しました。しかし、それは役に立ちません。DevExpress または WPF には、.NET にユーザー コントロールを破棄するように指示できるプロパティがありますか? 私が DevExpress で見つけたものですが、zilch は次のとおりです。

DisposeOnWindowClosing
DestroyOnClosingChildren

作成されたビューは非常に複雑です。メモリを節約するためにレイアウトを再編成しました。でも同じくらい増えます。提案は大変ありがたいです。

編集:ただし、デストラクタは呼び出されません...

4

1 に答える 1

1

これは、ItemsControl (この場合は ListBox) 内にネストされた UserControls を破棄する方法です。

        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 にある必要があり、ビューが不要になったときに呼び出す必要があります。

HTH、

バブ。

于 2012-07-18T12:21:00.483 に答える