Reactive Extensions (Rx) - subscribe to mouse position data only while holding the key

In WPF, I would like to subscribe to mouse position points only while holding the key. Then I want to set the captured points to the property only when the key is released (i.e., when I have a full set of captured points) and continue listening to the next up / down combination of keys to create another capture of mouse positions, etc.

My interpretation of the above is that I need to call the sequence when the key is down and stop accepting when the key is released, but I want OnNext to get a set of mouse points.

From a lot of reading (I'm new to Rx), I put together the following pseudo / real sample:

var keyDownSeq = Observable.FromEvent(...);
var keyUpSeq = Observable.FromEvent(...);
var mouseMoveSeq = Observable.FromEvent(...);

var mouseMovesWhileKeyDown = keyDownSeq
    .Where(keyEventArgs => keyEventArgs.IsRepeat == false) //WPF fires the same KeyDown repeatedly
    .Where(keyEventArgs => keyEventArgs.Key == Key.Space)
    .Select(_ => mouseMoveSeq
                    .TakeUntil(keyUpSeq)
                    .ToList())
    .Subscribe(listOfMousePoints => MyProperty = listOfMousePoints);
  • , , , , ? ToList(), , ?

  • Where ( () ), ?

.

Edit

, ?

  • KeyDown Select()
  • Reset null, KeyUpSeq
  • KeyDownSeq, ,
  • KeyUpSeq, KeyUp,

Rx ?

+3
2

.

.

IObservable<Unit> keyDown = Observable.FromEvent(/*keydown*/).Select(_=>true);
IObservable<Unit> keyUp = Observable.FromEvent(/*keyup*/).Select(_=>false);

IObservable<Point> mouseMoves = Observable.FromEvent(...);

, , , keyDown

var keys = keyDown.Merge(keyUp).DistinctUntilChanged().SkipWhile(_=>!_);

.

IOBservable<IObservable<Point> mousePaths = 
    mouseMoves
       .Window(keys)
       .Where((_,i)=>i%2==0);

, . . .

, keyDown keyUp.

, , , , . , . , keyUp .

+1

. IObservable<bool>, , "" "".

//true means key down, false means key up
IObservable<bool> keyChange =
    Observable.Merge(
        Observable.FromEvent(/*keyDown*/).Select(_ => true),
        Observable.FromEvent(/*keyUp*/).Select(_ => false))
    .DistinctUntilChanged();

, a x - , a T F , .

keyDown    -----xxxxxxxx--------xxxxxxx------xxxxxxxxxxxxx----
keyUp      xxxxx--------xxxxxxxx-------xxxxxx-------------xxxx
keyChange  F----T-------F-------T------F-----T------------F---

-, Observable.Window, "" " ".

IObservable<Point> mouseMoves = Observable.FromEvent(...);

IObservable<IObservable<Point>> mousePaths = mouseMoves.Window(
    keyChange.Where(b => b),
    _ => keyChange.Where(b => !b));

:

Window , , .

+2

All Articles