使用ActivateItem

时间:2019-11-30 15:37:40

标签: c# wpf gif caliburn.micro

我有一个导体ShellViewModel,其中包含另一个导体SetupViewModel,它将在特定的身份验证过程之后显示。 SetupViewModel具有三个按钮和一个ContentControl。每个按钮通过ActivateItem(xyzViewModel)显示三个屏幕之一,其中每个ViewModel x,y,z在我的SimpleContainer中被注册为Singleton。

我面临的问题是屏幕x显示了消耗内存的GIF,它将从本地存储中加载。每次我在屏幕之间切换(=单击按钮之一)时,我的应用程序似乎不仅会显示,而且还会重新加载屏幕,直到重新加载屏幕x 3次会导致应用程序崩溃,因为它使用超过4GB的进程内存,而从本地存储中加载数据仅进行一次。

  1. 我是否错误地认为ActivateItem(...)会激活绑定到ViewModel的View(类似于WinForms中的Show())?切换时,我没有通过TryClose()关闭ViewModel,所以我认为它将是打开的,只是不可见。
  2. 有没有办法通过丑陋的解决方法来实现所需的功能而又不破坏MVVM模式?

我真的不知道我是否缺少某些东西,这个问题确实使我的开发过程停滞了。

我在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,因为旧的库“占用了大量内存”。使用新库可以解决此问题。

0 个答案:

没有答案