执行 ReactiveCommand 后延迟显示 UI 控件
Delayed display of a UI control after execution of ReactiveCommand
我有一个基于信号执行的反应命令readCommand
。
IObservable<Unit> readSignal = ...
readSignal.InvokeCommand(readCommand);
命令的结果显示在用户控件中,比方说 TextBox
。
我想在 TextBox
旁边放置一个 refresh button
,单击它会调用 readCommand
。此按钮在执行命令时不应该可见,然后在执行命令 5 秒后可见。
我对 display/hide refresh button
的尝试如下。 IsRefreshable
链接到 refresh button
的 Visibility
属性。
readCommand
.IsExecuting
.SelectMany(x => (x ? Observable.Timer(TimeSpan.FromMilliseconds(0)) : Observable.Timer(refreshTimeout)).Select(_ => !x))
.ToPropertyEx(this, vm => vm.IsRefreshable, false, false, RxApp.MainThreadScheduler);
我认为当 readSignal
的发射速率低于刷新速率 (refreshTimeout
) 时,它工作正常。但如果 readSignal
速率快于 refreshTimeout
.
则显然不起作用
对于 SelectMany
,您通过合并所有内部可观察对象将 IObservable<IObservable<T>>
转变为 IObservable<T>
- 这意味着所有计时器都会触发,从而导致不良行为。
A SelectMany
实际上与 Select
/Merge
组合相同。
您需要的只是从最新生成的内部可观察对象中生成值。为此,您需要 Select
/Switch
组合。
试试这个:
readCommand
.IsExecuting
.Select(x => x
? Observable.Timer(TimeSpan.FromMilliseconds(0))
: Observable.Timer(refreshTimeout).Select(_ => !x))
.Switch()
.ToPropertyEx(this, vm => vm.IsRefreshable, false, false, RxApp.MainThreadScheduler);
我有一个基于信号执行的反应命令readCommand
。
IObservable<Unit> readSignal = ...
readSignal.InvokeCommand(readCommand);
命令的结果显示在用户控件中,比方说 TextBox
。
我想在 TextBox
旁边放置一个 refresh button
,单击它会调用 readCommand
。此按钮在执行命令时不应该可见,然后在执行命令 5 秒后可见。
我对 display/hide refresh button
的尝试如下。 IsRefreshable
链接到 refresh button
的 Visibility
属性。
readCommand
.IsExecuting
.SelectMany(x => (x ? Observable.Timer(TimeSpan.FromMilliseconds(0)) : Observable.Timer(refreshTimeout)).Select(_ => !x))
.ToPropertyEx(this, vm => vm.IsRefreshable, false, false, RxApp.MainThreadScheduler);
我认为当 readSignal
的发射速率低于刷新速率 (refreshTimeout
) 时,它工作正常。但如果 readSignal
速率快于 refreshTimeout
.
对于 SelectMany
,您通过合并所有内部可观察对象将 IObservable<IObservable<T>>
转变为 IObservable<T>
- 这意味着所有计时器都会触发,从而导致不良行为。
A SelectMany
实际上与 Select
/Merge
组合相同。
您需要的只是从最新生成的内部可观察对象中生成值。为此,您需要 Select
/Switch
组合。
试试这个:
readCommand
.IsExecuting
.Select(x => x
? Observable.Timer(TimeSpan.FromMilliseconds(0))
: Observable.Timer(refreshTimeout).Select(_ => !x))
.Switch()
.ToPropertyEx(this, vm => vm.IsRefreshable, false, false, RxApp.MainThreadScheduler);