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