Last active
October 31, 2016 02:30
-
-
Save sakapon/6d3da221b2c5c311153014d0f8e31ca1 to your computer and use it in GitHub Desktop.
RxSample / MouseRx2Wpf / EventsExtension
This file contains 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
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using System.Reactive.Linq; | |
using System.Windows; | |
using System.Windows.Input; | |
namespace MouseRx2Wpf | |
{ | |
public class EventsExtension<TElement> where TElement : UIElement | |
{ | |
public TElement Target { get; } | |
public IObservable<IObservable<Vector>> MouseDrag { get; } | |
public EventsExtension(TElement target) | |
{ | |
Target = target; | |
// Replaces events with IObservable objects. | |
var mouseDown = Observable.FromEventPattern<MouseEventArgs>(Target, nameof(UIElement.MouseDown)).Select(e => e.EventArgs); | |
var mouseMove = Observable.FromEventPattern<MouseEventArgs>(Target, nameof(UIElement.MouseMove)).Select(e => e.EventArgs); | |
var mouseUp = Observable.FromEventPattern<MouseEventArgs>(Target, nameof(UIElement.MouseUp)).Select(e => e.EventArgs); | |
var mouseLeave = Observable.FromEventPattern<MouseEventArgs>(Target, nameof(UIElement.MouseLeave)).Select(e => e.EventArgs); | |
var mouseDownEnd = mouseUp.Merge(mouseLeave); | |
MouseDrag = mouseDown | |
.Select(e => e.GetPosition(Target)) | |
.Select(p0 => mouseMove | |
.TakeUntil(mouseDownEnd) | |
.Select(e => e.GetPosition(Target) - p0)); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment