如何为鼠标拖动交互编写RX.Net Observables



我想使用RX启用鼠标拖动行为来选择绘图中的区域。(Oxyplot(应该可以在一个绘图中选择多个区域,并且它们应该是所选区域的实时更新。

到目前为止,我已经从事件中建立了三个可观测值:

var mouseDownObservable = Observable.FromEventPattern<OxyMouseDownEventArgs>(tmp, nameof(tmp.MouseDown))
.Where(e => e.EventArgs.ChangedButton == OxyMouseButton.Left)
.Where(e => e.EventArgs.IsControlDown == true);
var mouseMoveObservable = Observable.FromEventPattern<OxyMouseEventArgs>(tmp, nameof(tmp.MouseMove));
var mouseUpObservable = Observable.FromEventPattern<OxyMouseEventArgs>(tmp, nameof(tmp.MouseUp));

我是RX的新手,所以我的第一次尝试是:

var result = mouseDownObservable
.Select(m => m.EventArgs.Position)
.Merge(mouseMoveObservable
.SkipUntil(mouseDownObservable.Select(e => e.EventArgs.Position).Do(e1 =>
{
// .. create annotation in plot
}))
.TakeUntil(mouseUpObservable)
.Select(m => m.EventArgs.Position)
.Repeat());
.CombineLatest(mouseDownObservable.Select(e => e.EventArgs.Position),
(endPoint, startPoint) => new List<ScreenPoint>() { endPoint, startPoint })
.Do(e =>
{
// .. update actual annotation to current endPoint
})
.Subscribe();

我不知道如何保存状态(mouseDown的startPoint(,所以我选择使用CombineLatest。

首先我选择了一个区域,它运行得很好。如果我想选择另一个区域,我会得到正确的startPoint(d1(,但端点仍然是(r(的最后一个元素。大理石图

  1. 保存起点信息的好方法是什么?我对此感到有点笨拙
  2. 我如何对结果进行分组,以便每个组合的鼠标拖动交互都有一个鼠标拖动可观察对象

我觉得你想得太多了。

以下是您需要的查询:

var deltas =
from down in mouseDownObservable
from move in mouseMoveObservable.TakeUntil(mouseUpObservable)
select new
{
X = move.EventArgs.Position.X - down.EventArgs.Position.X,
Y = move.EventArgs.Position.Y - down.EventArgs.Position.Y
};

所以这只是简单地等待鼠标放下,然后记录之后发生的所有移动,直到鼠标抬起。所以,基本上是一个拖动操作。

因为第一部分是from down in mouseDownObservable,所以您有一个鼠标放下时X/Y坐标的记录。然后很容易根据每次移动的位置生成一系列坐标增量。

相关内容

  • 没有找到相关文章

最新更新