ドラッグを終了すると下図のように Completed と表示されます。
このようにSkipUntil と TakeUntil と Repeat, Select などのこれまで紹介してきたメソッドを組
み合わせることで通常はフラグなどを使用して記載する処理を非常にシンプルに記載できました。
最後に、MainWindow.xaml.cs のコードの全体を下記に示します。
namespace DragSample
{
using System;
using System.Reactive.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Shapes;
/// <summary>
/// MainWindow.xaml の相互作用ロジック
/// </summary>
public partial class MainWindow : Window
59
67.
{
public MainWindow()
{
InitializeComponent();
// マウスダウン、マウスゕップ、マウスムーブの IObservable を作る
var mouseDown = Observable.FromEvent<MouseButtonEventHandler,
MouseButtonEventArgs>(
h => (s, e) => h(e),
h => this.MouseDown += h,
h => this.MouseDown -= h);
var mouseMove = Observable.FromEvent<MouseEventHandler, MouseEventArgs>(
h => (s, e) => h(e),
h => this.MouseMove += h,
h => this.MouseMove -= h);
var mouseUp = Observable.FromEvent<MouseButtonEventHandler,
MouseButtonEventArgs>(
h => (s, e) => h(e),
h => this.MouseUp += h,
h => this.MouseUp -= h);
var drag = mouseMove
// マウスムーブをマウスダウンまでスキップ。マウスダウン時にマウスをキャプチャ
.SkipUntil(mouseDown.Do(_ => this.CaptureMouse()))
// マウスゕップが行われるまで Take。マウスゕップでマウスのキャプチャをリリース
.TakeUntil(mouseUp.Do(_ => this.ReleaseMouseCapture()))
// ドラッグが終了したタミングで Completed を表示
.Finally(() => textBlock.Text = "Completed")
// これを繰り返す
.Repeat();
// ドラッグ中は、ベント引数から座標を取り出して表示用に整えて TextBlock に設定
drag.Select(e => e.GetPosition(null))
.Select(p => string.Format("X: {0}, Y:{1}", p.X, p.Y))
.Subscribe(s => textBlock.Text = s);
60