我正在尝试在Silverlight UI中实现延迟的MouseEnter事件处理程序。使用DispatcherTimer等以“经典”方式完成此操作后,我现在尝试使用Reactive扩展来执行相同操作。这应该更简洁易读,但不知怎的,我无法实现目标,即:
我浏览了RX文档,这是相当抽象的,并且这种实用类型的例子并不存在。基于在线发现的一些例子,我想出了类似的东西:
Observable.Throttle(
Observable.FromEventPattern(LanguageSelector, "MouseEnter"), TimeSpan.FromSeconds(2))
.TakeUntil(Observable.FromEventPattern(LanguageSelector, "MouseLeave"))
.ObserveOnDispatcher()
.Subscribe(e =>
{
ShowPopup();
});
似乎工作正常,但只有一次。一旦鼠标离开控件,它就不再起作用了,我的弹出窗口再也不会被触发了。关于如何做到这一点的任何更好的想法?
提前感谢!
答案 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());