【问题标题】:how to implement delayed MouseEnter event with Silverlight and Reactive extensions?如何使用 Silverlight 和 Reactive 扩展实现延迟的 MouseEnter 事件?
【发布时间】:2011-10-12 13:13:30
【问题描述】:

我正在尝试在我的 Silverlight UI 中实现延迟的 MouseEnter 事件处理程序。使用 DispatcherTimer 等以“经典”方式完成此操作后,我现在正尝试使用 Reactive 扩展来做同样的事情。这应该更简洁易读,但不知怎的我无法实现目标,即:

  • 当鼠标进入某个UI控件时,需要调用一个方法,
  • 但它应该只在经过一定时间后完成,即 1000 毫秒,在此期间鼠标保持在控件内
  • 因此,如果鼠标在此之前离开控件,则什么都不会发生,事件应该被“取消”

我浏览了 RX 文档,该文档相当抽象,而且几乎不存在这种实用类型的示例。根据网上找到的一些例子,我想出了这样的事情:

    Observable.Throttle(
      Observable.FromEventPattern(LanguageSelector, "MouseEnter"), TimeSpan.FromSeconds(2))
      .TakeUntil(Observable.FromEventPattern(LanguageSelector, "MouseLeave"))
      .ObserveOnDispatcher()
      .Subscribe(e =>
      {
          ShowPopup();
      });

它似乎工作正常,但只有一次。一旦鼠标离开控件,它将不再起作用,我的弹出窗口不再被触发。关于如何做到这一点有更好的想法吗?

提前致谢!

【问题讨论】:

    标签: silverlight system.reactive


    【解决方案1】:

    您的解决方案只触发一次的原因是TakeUntil。一旦 MouseLeave 发生,你的 observable 就会被处理掉。 SelectMany 方法可以用来解决这个问题:

    var mouseEnter = Observable.FromEventPattern(LanguageSelector, "MouseEnter");
    var mouseLeave = Observable.FromEventPattern(LanguageSelector, "MouseLeave");
    
    mouseEnter
        .SelectMany(mousePos => 
            Observable.Timer(TimeSpan.FromSeconds(2)).ObserveOnDispatcher()
            .TakeUntil(mouseLeave))
        .Subscribe(e => ShowPopup());
    

    【讨论】:

    • 谢谢,马特,这非常完美!学习如何思考“RX 方式”需要时间,但似乎绝对值得!
    • @Tomasz 由于 Matt 的解决方案有效,请考虑通过单击复选标记来接受他的回答。这会鼓励人们在未来回答您的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    相关资源
    最近更新 更多