WPF/Caliburn 的非 ui 阻塞任务

Non-ui blocking tasks with WPF/Caliburn

我正在尝试从外部 API 获取一定数量的数据并将其填充到视图的列表中。我的设置类似于以下内容(摘录):

ShellView

<xctk:BusyIndicator IsBusy="{Binding IsBusy}">
    <ContentControl x:Name="ActiveItem" />
    ...

ShellViewModel

...
public bool IsBusy
{
    get { return _isBusy; }
    private set
    {
        _isBusy = value;
        NotifyOfPropertyChange();
    }
}

public void StartProgress()
{
    IsBusy = true;
}

public void StopProgress()
{
    IsBusy = false;
}

protected override void OnViewLoaded(object view)
{
    base.OnViewLoaded(view);
    // do some task
    ActivateItem(SomeOtherViewModel);
}

SomeOtherViewModel

public SomeOtherViewModel(IBusyIndicator busy)
{
  ....
}

protected override void OnViewLoaded(object view)
{
    base.OnViewLoaded(view);

    Task.Factory.StartNew(ACTION,
                    CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default)
                    .ConfigureAwait(true);
}

基本上,工作流程是这样的:

  1. 初始化Shell
  2. Shell -> OnViewLoaded
  3. 做一些后台工作
  4. 初始化SomeOtherViewModel 得到 IBusyIndicator 注入,即 Shell 作为单例
  5. SomeOtherViewModel -> OnViewLoaded
  6. 做其他后台工作,如上例所示

但是,当我启动该应用程序时,直到所有内容都加载完毕后我才能看到视图。有没有办法:

如果您希望在 UI 中的可见性发生变化时发生某些事情,那么您应该在 UI 层中对其进行编码,根据您的用例在 Loaded 事件或 VisibilityChanged 上进行编码。

如果您需要它来触发 ViewModel 上的操作,那么只需引用 UI 中的 ViewModel。这在 MVVM 中是可以接受的。

public ViewModel ViewModel
{
    get
    {
        return DataContext as ViewModel;
    }
}

public void OnLoaded()
{
    ViewModel.DoThatThing();
}

为了找出您的线程阻塞的原因,我需要查看完整的代码示例。