如果你只需要拖拽,那么简单的.Zip工作不是吗
var drag = _mouseDown
.Select(args => args.EventArgs.GetPosition(canvas))
.Zip(_mouseUp.Select(args => args.EventArgs.GetPosition(canvas)),
(p1, p2) => new { p1, p2 });
drag.Subscribe(p1p2 =>
Console.WriteLine(@"({0}:{1})({2}:{3})",
p1p2.p1.X, p1p2.p1.Y, p1p2.p2.X, p1p2.p2.Y));
编辑:不过,Zip很容易在窗口外释放鼠标-在这种情况下,除非您捕获到。。。
以下版本仅使用鼠标按下前的最新鼠标按下:
var drag = _mouseDown
.Select(args => args.EventArgs.GetPosition(canvas))
.TakeUntil(_mouseUp)
.CombineLatest(_mouseUp
.Select(args => args.EventArgs.GetPosition(canvas))
.Take(1), (p1, p2) => new { p1, p2 })
.Repeat();