当执行页面上的2个ReactiveCommands中的任何一个时,我需要在我的应用程序中禁用WPF UI。命令被一一调用。
我做了类似的观察:
IObservable<bool> CanInteractWithUserObservable => Command1.IsExecuting
.CombineLatest(Command2.IsExecuting, (c1,c2)=>(c1,c2))
.Select(tuple => tuple.c1 || tuple.c2)
.Select(res => !res)
.ObserveOn(RxApp.MainThread);
并将其绑定到Window.IsEnabled属性。
通常,它可以工作,但是当1个命令完成它的工作可观察但返回值true但第二个还没有开始的问题。因此,总体输出为:
true; //开始之前
false; //执行第一个命令
true; // 第一个命令完成,第二个尚未开始(是问题)
false; //执行第二个命令
true; //两个命令都完成了
我需要收听序列,并且仅在距离上一个真实事件大约半秒后,我才应该在我的CanInteractWithUserObservable中发布更新,以避免UI闪烁。
P.S .:可能是超时方法可能对我有帮助,但我不知道如何使用它。
如果我理解正确,您想等待两个事件都完成,然后释放您的UI。
虽然这不是一个很好的通用解决方案,但是在WPF中延迟某些内容的标准方法是使用Dispatcher.BeginInvoke(action)。它轮询Dispatcher
队列上的一个异步调用,为它分配一些可配置的优先级,这使您可以延迟一些逻辑,直到线程上的当前工作完成为止。然后按顺序处理呼叫。例如,仅在所有未完成的渲染任务完成后,才可以使用它执行一些代码。 ...或者它可以用来延迟一些时间。