我想使用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(的最后一个元素。大理石图
- 保存起点信息的好方法是什么?我对此感到有点笨拙
- 我如何对结果进行分组,以便每个组合的鼠标拖动交互都有一个鼠标拖动可观察对象
我觉得你想得太多了。
以下是您需要的查询:
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
坐标的记录。然后很容易根据每次移动的位置生成一系列坐标增量。