如何延迟两个信号之一但在必要时丢弃它?

问题描述

我在 Xamarin.Forms 应用程序中使用 ReactiveUI 和 Prism。

Prism,一方面控制页面出现/消失信号,并在视图导航动画开始之前发送消失事件。 另一方面,ReactiveUI 提供了 view.WhenActivated(...) 扩展以仅在显示视图时建立视图绑定。 view.WhenActivated() 在消失事件被触发时被释放。

由于 Prism 在仍然显示 view-to-unload 时发送消失事件,因此视图绑定在客户眼前消失。

为了防止这种情况发生,我尝试注册我自己的 ReactiveUI 实现的 IActivationForViewFetcher (ReactiveUI.XamForms.ActivationForViewFetcher) 副本,并在动画尚未结束时延迟消失事件(1 秒)。

var appearing = Observable.FromEvent<EventHandler,bool>(
       eventHandler =>
       {
         void handler(object sender,EventArgs e) => eventHandler(true);

         return handler;
       },x => page.Appearing += x,x => page.Appearing -= x)
     // timestamp the event for later take-last scan
    .Timestamp();

var disappearing = Observable.FromEvent<EventHandler,bool>(
       eventHandler =>
        {
          void handler(object sender,EventArgs e) => eventHandler(false);

          return handler;
        },x => page.disappearing += x,x => page.disappearing -= x)
     // timestamp the event for later take-last scan
    .Timestamp()
     // slow-down the disappearing event to avoid visual un-binding effects
     // like re-enabled buttons,values unset and so on.
    .Throttle(TimeSpan.FromSeconds(1))
    .ObserveOn(RxApp.MainThreadScheduler);

return Observable
    .Merge(appearing,disappearing)
    .Scan(new Timestamped<bool>(false,DateTimeOffset.MinValue),(last,n) => n.Timestamp >= last.Timestamp ? n : last)
    .Select(v => v.Value)
    .distinctUntilChanged();

这在用户速度较慢的情况下效果很好,但在某些情况下,消失延迟可能会将活动页面呈现为停用状态。

现在我的问题:

有没有更简单的方法来延迟消失信号,但要避免它作为一个整体,以防页面在延迟窗口中重新激活?

多一点信息:出现和消失事件可能会被框架多次触发,因此取消/激活的页面可能会再次取消/激活而无效。

谢谢

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...