【发布时间】:2012-10-10 15:38:39
【问题描述】:
我有一个应用程序,它在 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 在幕后有什么特别的事情可以避免这种情况吗?
Alt 选项 2:将每个可用模块放在 XAML 中并在那里显示/隐藏它们:
<Window ... >
<Grid>
<view:SplashScreenView Visibility="Visible" />
<view:MediaPlayerView Visibility="Collapsed" />
<view:SlideShowView Visibility="Collapsed" />
</Grid>
</Window>
再次,我很好奇在我不熟悉的背景中可能发生的内存管理。当我折叠某物时,它会完全进入某种休眠状态吗?我读过有些东西可以(没有命中测试、事件、关键输入、焦点……)但是动画和其他东西呢?
感谢您的任何意见!
【问题讨论】:
标签: c# wpf mvvm wpf-controls mvvm-light