我有一个应用程序,我使用 CompositeCommand 来触发一系列子命令。子命令组合起来可能需要 15 秒以上才能完成。当这种情况发生时,我只想向用户显示一条消息。实际上,如果我可以显示进度就好了,但事实证明,仅仅显示消息本身就非常困难。我尝试使用 DialogService 显示一个对话框,但这不起作用,因为我无法找到在子命令完成后关闭它的方法。所以我想我应该在我的视图上放置一条涵盖所有内容的消息,并将其 Visibility 属性绑定到 InProgress 属性。屏幕上的按钮运行常规的委托命令,执行以下操作:
private void ShowInProgressDialog()
{
InProgress = true;
_applicationCommands.RunFullScanCommand.Execute(null);
}
我使用 EventAggregator 向每个孩子发送消息以表明他们已完成,并将 InProgress 设置回 false。单步执行,所有内容都会到达断点,但复合命令不允许更新 UI,直到子命令全部完成。因此,即使 InProgress 属性在整个过程中得到正确设置,UI 也永远不会更新,也永远不会显示我的消息 UI。所以我尝试将其分解为自己的方法:
private void ShowInProgressDialog()
{
InProgress = true;
}
private void RunScan()
{
ShowInProgressDialog();
_applicationCommands.RunFullScanCommand.Execute(null);
}
结果还是一样。好吧,那么,如果我尝试一些黑客行为,比如向自己发布一条消息并订阅该消息,该怎么办?因此,实际上,附加到委托命令的代码将在发布消息后完全完成运行,然后视图模型单独接收消息并触发 CompositeCommand:
private void ShowInProgressDialog()
{
InProgress = true;
}
private void RunScan()
{
ShowInProgressDialog();
_eventAggregator.GetEvent<ScanBeginEvent>().Publish(new Scan(ScanType.Full, ScanFunction.System));
}
private void ScanBegin(Scan scan)
{
_applicationCommands.RunFullScanCommand.Execute(null);
}
不。相同的结果。这看起来应该是可行的,但我在这里碰壁了,没有想法了。还有其他人做过类似的事情并使其正常工作吗?
事实证明我确实必须将一些处理转移到任务中。我描述的上述行为适用于 UI 线程上的所有内容。正如 Haukinger 的评论中提到的,它是阻塞的。我之前也曾尝试将事物移至任务中(忘记在我原来的帖子中提及这一点),但当结果返回时,这并不能正确执行我的导航。本质上,我试图在任务中投入过多的处理。一旦我将其限制为任务中绝对必要的内容,它就可以正常工作。