ContentControl で一度に 1 つのビューを表示するアプリケーションがあります。私は現在の解決策を持っていますが、メモリ管理のためのより良い解決策があるかどうか興味がありました.
私の現在の設計では、表示する必要があるときに新しいオブジェクトを作成し、表示されなくなったときにそれらを破棄します。これがより良いアプローチなのか、それとも各ビューへの参照を維持し、それらの参照間で交換する方が良いのか、私は興味がありますか?
ここで、私のアプリケーション レイアウトについてもう少し説明します。
私の MainWindow.xaml の非常に単純化されたバージョンは次のようになります。
<Window ... >
<Window.Resources>
<DataTemplate DataType="{x:Type vm:SplashViewModel}">
<view:SplashView />
</DataTemplate>
<DataTemplate DataType="{x:Type vm:MediaPlayerViewModel}">
<view:MediaPlayerView />
</DataTemplate>
</Window.Resources>
<Grid>
<ContentControl Content="{Binding ActiveModule}" />
</Grid>
</Window>
MainViewModel.cs で、ActiveModule パラメーターを新しく初期化された ViewModel と交換します。たとえば、コンテンツを交換するための擬似コード ロジック チェックは次のようになります。
if (logicCheck == "SlideShow")
ActiveModule = new SlideShowViewModel();
else if (logicCheck == "MediaPlayer")
ActiveModule = new MediaPlayerViewModel();
else
ActiveModule = new SplashScreenViewModel();
しかし、参照を維持するだけで、速度とメモリ使用量がより適切になりますか?
代替オプション 1: 各 ViewModel への静的参照を作成し、それらの間で交換します...
private static ViewModelBase _slideShow = new SlideShowViewModel();
private static ViewModelBase _mediaPlayer = new MediaPlayerViewModel();
private static ViewModelBase _splashView = new SplashScreenViewModel();
private void SwitchModule(string logicCheck) {
if (logicCheck == "SlideShow")
ActiveModule = _slideShow;
else if (logicCheck == "MediaPlayer")
ActiveModule = _mediaPlayer;
else
ActiveModule = _splashView;
}
ここで常に作成/破棄しているわけではありませんが、このアプローチは、未使用のモジュールがぶらぶらしているだけでメモリを浪費しているように見えます。または...これを回避するために特別なWPFが舞台裏で行っていることはありますか?
別のオプション 2: 利用可能な各モジュールを XAML に配置し、そこで表示/非表示を切り替えます。
<Window ... >
<Grid>
<view:SplashScreenView Visibility="Visible" />
<view:MediaPlayerView Visibility="Collapsed" />
<view:SlideShowView Visibility="Collapsed" />
</Grid>
</Window>
繰り返しになりますが、私がよく知らないバックグラウンドでどのようなメモリ管理が行われているのか興味があります。何かを折りたたむと、完全に冬眠状態になりますか? 私はいくつかのもの(ヒットテスト、イベント、キー入力、フォーカスなどはありません)を読みましたが、アニメーションやその他のものはどうですか?
ご意見ありがとうございます。