如何用Silverlight和Reactive扩展实现延迟的MouseEnter事件



我正在尝试在我的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();
      });

它似乎工作良好,但只有一次。一旦鼠标离开控制,它将不再工作,我的弹出再也不会被触发。有什么更好的办法吗?

提前感谢!

您的解决方案只触发一次的原因是TakeUntil。一旦发生MouseLeave,你的可观察对象就会被销毁。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());

最新更新