您可以从现有事件创建 Observables。您可以为此目的使用 Observable.FromEvent。您可以像这样编写 GetMouseDown 事件包装器,作为 UI 元素的扩展方法。
public static IObservable<Event<MouseButtonEventArgs>>
GetMouseDown (this UIElement el)
{
var allevents = Observable.FromEvent<MouseButtonEventHandler, MouseButtonEventArgs>
( h => new MouseButtonEventHandler(h),
h => el.MouseDown += h,
h=> el.MouseDown -= h
);
return allevents;
}
稍后,您可以以完全声明的方式“处理”您的事件。喜欢
//create an observable declaratively
var mouseDowns=button.GetMouseDown();
//subcribe and do what ever you need
mouseDowns.Subscribe(arg=> MessageBox.Show(arg.ClickCount.ToString()) );
这里是如何创建一个具有初始位置和当前位置的“拖动”可观察对象。
//Get the initial position and dragged points using LINQ to Events
var mouseDragPoints = from md in e.GetMouseDown()
let startpos=md.EventArgs.GetPosition(e)
from mm in e.GetMouseMove().Until(e.GetMouseUp())
select new
{
StartPos = startpos,
CurrentPos = mm.EventArgs.GetPosition(e),
};
//And subscribe here to mouseDragPoints
阅读这篇文章LINQ to Events - 有关 .NET Reactive Extensions 的更多信息并使用源代码。