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

时间:2011-10-12 13:13:31

标签: silverlight system.reactive

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

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

提前感谢!

1 个答案:

答案 0 :(得分:1)

您的解决方案仅触发一次的原因是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());