我有一个应用程序,它在 ContentControl 中一次显示一个视图。我有一个当前的解决方案,但很好奇是否有更好的内存管理解决方案。
我当前的设计在需要显示时创建新对象,并在它们不再可见时销毁它们。我很好奇这是否是更好的方法,或者维护对每个视图的引用并在这些引用之间进行交换更好?
这是我的应用程序布局的更多解释:
我的 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();
但是,仅仅保持一个参考在速度和内存使用方面会更合适吗?
Alt 选项 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>
同样,我很好奇在我不熟悉的背景中可能发生的内存管理。当我折叠某物时,它会完全进入某种休眠状态吗?我读过一些东西(没有命中测试,事件,关键输入,焦点,......)但是动画和其他东西呢?
感谢您的任何意见!