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);
}
基本上,工作流程是这样的:
- 初始化
Shell
Shell
-> OnViewLoaded
- 做一些后台工作
- 初始化
SomeOtherViewModel
( 得到 IBusyIndicator
注入,即 Shell
作为单例 )
SomeOtherViewMode
l -> OnViewLoaded
- 做其他后台工作,如上例所示
但是,当我启动该应用程序时,直到所有内容都加载完毕后我才能看到视图。有没有办法:
- 仅当所有内容都可见时才执行操作(WPF/Caliburn)
- 执行
Task
而不阻止 UI/查看模型更新?
如果您希望在 UI 中的可见性发生变化时发生某些事情,那么您应该在 UI 层中对其进行编码,根据您的用例在 Loaded 事件或 VisibilityChanged 上进行编码。
如果您需要它来触发 ViewModel 上的操作,那么只需引用 UI 中的 ViewModel。这在 MVVM 中是可以接受的。
public ViewModel ViewModel
{
get
{
return DataContext as ViewModel;
}
}
public void OnLoaded()
{
ViewModel.DoThatThing();
}
为了找出您的线程阻塞的原因,我需要查看完整的代码示例。
我正在尝试从外部 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);
}
基本上,工作流程是这样的:
- 初始化
Shell
Shell
-> OnViewLoaded- 做一些后台工作
- 初始化
SomeOtherViewModel
( 得到IBusyIndicator
注入,即Shell
作为单例 ) SomeOtherViewMode
l -> OnViewLoaded- 做其他后台工作,如上例所示
但是,当我启动该应用程序时,直到所有内容都加载完毕后我才能看到视图。有没有办法:
- 仅当所有内容都可见时才执行操作(WPF/Caliburn)
- 执行
Task
而不阻止 UI/查看模型更新?
如果您希望在 UI 中的可见性发生变化时发生某些事情,那么您应该在 UI 层中对其进行编码,根据您的用例在 Loaded 事件或 VisibilityChanged 上进行编码。
如果您需要它来触发 ViewModel 上的操作,那么只需引用 UI 中的 ViewModel。这在 MVVM 中是可以接受的。
public ViewModel ViewModel
{
get
{
return DataContext as ViewModel;
}
}
public void OnLoaded()
{
ViewModel.DoThatThing();
}
为了找出您的线程阻塞的原因,我需要查看完整的代码示例。