我有一个导体ShellViewModel
,其中包含另一个导体SetupViewModel
,它将在特定的身份验证过程之后显示。 SetupViewModel
具有三个按钮和一个ContentControl。每个按钮通过ActivateItem(xyzViewModel)
显示三个屏幕之一,其中每个ViewModel x,y,z
在我的SimpleContainer
中被注册为Singleton。
我面临的问题是屏幕x
显示了消耗内存的GIF,它将从本地存储中加载。每次我在屏幕之间切换(=单击按钮之一)时,我的应用程序似乎不仅会显示,而且还会重新加载屏幕,直到重新加载屏幕x
3次会导致应用程序崩溃,因为它使用超过4GB的进程内存,而从本地存储中加载数据仅进行一次。
ActivateItem(...)
会激活绑定到ViewModel的View(类似于WinForms中的Show()
)?切换时,我没有通过TryClose()
关闭ViewModel,所以我认为它将是打开的,只是不可见。我真的不知道我是否缺少某些东西,这个问题确实使我的开发过程停滞了。
我在SetupViewModel
中的代码:
private readonly SettingsViewModel _settingsVM;
public SetupViewModel(IEventAggregator events, SettingsViewModel settingsVM)
{
_events = events;
_events.Subscribe(this);
_settingsVM = settingsVM;
}
public void Settings()
{
ActivateItem(_settingsVM);
}
我的SettingsViewModel
:
private readonly IEventAggregator _events;
bool loaded;
public SettingsViewModel(IEventAggregator events)
{
_events = events;
}
//Triggered everytime I call ActivateItem(_settingsVM), so I try to load data only once
protected override async void OnViewLoaded(object view)
{
base.OnViewLoaded(view);
if (!loaded)
{
await LoadSettings();
loaded = true;
}
}
编辑:非常感谢@Eldar。正如@Eldar指出的那样,我提到了GIF图片的使用。这是我的SettingsView
的大致代码表示形式:
<UserControl
:
:
xmlns:gif="http://wpfanimatedgif.codeplex.com">
<Image gif:ImageBehavior.AnimatedSource="{Binding LogoPath}"
Stretch="Uniform"
VerticalAlignment="Center" />
</UserControl>
真正的问题确实是WpfAnimatedGif。开发人员创建了一个新的软件包XamlAnimatedGif,因为旧的库“占用了大量内存”。使用新库可以解决此问题。