如何在按住鼠标按钮的同时防止mousemove事件?

问题描述:

我得到了一个我想要移动鼠标的网格。虽然我只是徘徊和移动鼠标,我希望事件发生,但当我按下mousedown时,他们应该暂停发射。一旦我开枪mouseup他们应该继续。如何在按住鼠标按钮的同时防止mousemove事件?

如果这听起来超级简单,它可能不是。过了一段时间,我们想出了一个不太优雅的解决方案,但我想知道是否存在更好的东西。我不会用我们的黑客来影响你的方法。

不起作用

mouseMove.TakeUntil(mouseDown).Repeat() 

添加.SkipUntil(mouseUp)所以初始代码向左或向右TakeUntil basicly停止上述代码从所有工作。

+0

生病到达那里..我想你不会喜欢我的最后一个问题要么 –

如何:

bool mouseIsDown = false; 
Observable.Merge(
    mouseDown.Select(_ => true), 
    mouseUp.Select(_ => false) 
).Subscribe(x => mouseIsDown = x); 

mouseMove.Where(_ => !mouseIsDown); 

技术上正确的答案涉及的窗户操作,但是这仅仅是好,更容易神交(和更容易为我写的)

+0

这实际上是相反的要求。你只需要在Where中反转条件。无论如何。 –

+0

糟糕 - 修好了,谢谢 –

这可能是一个更多钞票溶液

// create the observables 
IObservable<Point> mouseMove = Observable.FromEventPattern<MouseEventArgs>(this, "MouseDown") 
    .Select(e=>e.EventArgs.GetPosition(this)); 

IObservable<bool> mouseDown = Observable.FromEventPattern(this, "MouseDown").Select(_ => false); 
IObservable<bool> mouseUp = Observable.FromEventPattern(this, "MouseUp").Select(_ => true); 

var merged = mouseUp.Merge(mouseDown).StartWith(true); 

// sends the moves with the current state of the mouse button 
var all = mouseMove.CombineLatest(merged, (move, take) => new {Take = take, Move = move}); 

// the result is all the points from mouse move where the mouse button isn't pressed 
var result = all.Where(t => t.Take).Select(t => t.Move); 

下面是2个可能的解决方案

var beh = new BehaviorSubject<bool>(true); 
mousedown.Select(_ => false).Subscribe(beh); 
mouseup.Select(_ => true).Subscribe(beh); 
mousemove.SelectMany(e => 
{ 
    return mousemove.TakeUntil(beh.Where(b => !b)); 
}).Subscribe(....); 

OR

var du = mousedown.Select(_ => false).Merge(mouseup.Select(_ => true)).Merge(Observable.Return(true)); 
mousemove.CombineLatest(du, (ev, b) => new Tuple<MouseEventArgs, bool>(ev.EventArgs, b)) 
.Where(t => t.Item2) 
.Select(t => t.Item1) 
.Subscribe(....); 

这工作:

 var mouseMoveWhileUpOnly = 
      mouseUp 
       .Select(mu => 
        mouseMove 
         .TakeUntil(mouseDown)) 
       .Switch(); 

,你需要做的就是观察的开始而实际上根本没做手工鼠标了唯一的技巧就是:

 var mouseUp = Observable 
      .FromEventPattern<MouseButtonEventHandler, MouseButtonEventArgs>(
       h => this.MouseLeftButtonUp += h, 
       h => this.MouseLeftButtonUp -= h) 
      .Select(ep => Unit.Default) 
      .StartWith(Unit.Default); 

请注意StartWith

否则mouseDown & mouseMove observables正常定义。