Skip to content

Instantly share code, notes, and snippets.

@sakapon
Last active October 31, 2016 02:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sakapon/6d3da221b2c5c311153014d0f8e31ca1 to your computer and use it in GitHub Desktop.
Save sakapon/6d3da221b2c5c311153014d0f8e31ca1 to your computer and use it in GitHub Desktop.
RxSample / MouseRx2Wpf / EventsExtension
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