Skip to content

Instantly share code, notes, and snippets.

@danielmoore
Created August 31, 2011 04:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save danielmoore/1182831 to your computer and use it in GitHub Desktop.
Save danielmoore/1182831 to your computer and use it in GitHub Desktop.
double click mouse move in RX and WPF
var target = new Border{ Background = Brushes.SteelBlue, Width = 200, Height = 200 };
var win = new Window{ Content = target };
var mouseDown = Observable.FromEventPattern<MouseEventArgs>(target, "MouseLeftButtonDown");
var mouseMove = Observable.FromEventPattern<MouseEventArgs>(target, "MouseMove");
var mouseUp = Observable.FromEventPattern<MouseEventArgs>(target, "MouseLeftButtonUp");
// dragEvents is IObservable<IObservable<EventPattern<MouseMoveEvent>>>
// The first dimmension represents the sequence of discrete drag "sessions"
// The second dimmension represents the sequence of moves within that drag
var dragEvents = mouseDown // for every mouse down
.SelectMany(e => mouseDown
.Take(1) // take the next mouse down
// but timeout after 400ms.
.Timeout(TimeSpan.FromMilliseconds(400), Observable.Empty<EventPattern<MouseEventArgs>>()))
// then, for every double-click, take all the mouse moves
// until you hit a mouse up event.
.Select(e2 => mouseMove.TakeUntil(mouseUp));
// simulate user code
dragEvents
.SelectMany(x => Observable.Defer(() =>
{
Console.WriteLine("start");
return x.Do(y => Console.WriteLine("move")).Finally(() => Console.WriteLine("stop"));
}))
.Subscribe();
win.ShowDialog();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment