Created
August 31, 2011 04:36
-
-
Save danielmoore/1182831 to your computer and use it in GitHub Desktop.
double click mouse move in RX and WPF
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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