Observable は既存のイベントから作成できます。この目的で Observable.FromEvent を使用できます。UI 要素の拡張メソッドとして、このような 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 - More on .NET Reactive Extensionsを読んで、ソース コードを試してみてください。