Вы можете создавать Observables из существующих событий. Вы можете использовать Observable.FromEvent для этой цели. Вы можете написать обертку события GetMouseDown, например, как метод расширения для элемента пользовательского интерфейса.
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 и играйте с исходным кодом.