如何解决使用 OxyPlot 获取范围的坐标
我想从 OxyPlot PlotView 图表中读取开始和结束坐标。以下是来自 viewmodel 的代码片段。
plotModel.MouseDown += (s1,e1) =>
{
if (e1.ChangedButton == OxyMouseButton.Middle)
{
plotModel.MouseUp += (s2,e2) =>
{
if (e2.IsControlDown)
{
DateTime xstart = DateTime.FromOADate(xAxis.InverseTransform(e1.Position.X,e1.Position.Y,yAxis).X);
double ystart = yAxis.InverseTransform(e1.Position.X,yAxis).Y;
DateTime xend = DateTime.FromOADate(xAxis.InverseTransform(e2.Position.X,e2.Position.Y,yAxis).X);
double yend = yAxis.InverseTransform(e2.Position.X,yAxis).Y;
}
};
}
};
问题是我得到的 xstart
和 ystart
的值不正确,似乎 y 的值只是一个随机数,而 x 的值在某种程度上可以接受。 xend
和 yend
是正确的。
我应该在代码中更改某些内容还是有其他方法可以解决此问题?
我使用中间按钮,因为它突出显示了所选区域,但我找不到简单的方法来获取该区域的坐标。
解决方法
有几种方法可以实现这一点。您可能已经注意到,绘图模型的事件被标记为过时,但它们不会在不久的将来被删除,因为如果客户端需要从外部访问有关内部更改的信息,尚不清楚如何替换它们(见here)。
因此,这是使用鼠标按下点的私有字段实现基于事件的简单方法:
/// <summary>
/// Constructor
/// </summary>
public MyClass()
{
...
var plotModel = new PlotModel();
plotModel.MouseDown += PlotModel_MouseDown;
plotModel.MouseUp += PlotModel_MouseUp;
}
private ScreenPoint mouseDownPoint;
private void PlotModel_MouseDown(object sender,OxyMouseDownEventArgs e)
{
if (e.ChangedButton == OxyMouseButton.Middle)
{
mouseDownPoint = e.Position;
}
}
private void PlotModel_MouseUp(object sender,OxyMouseEventArgs e)
{
if (e.IsControlDown)
{
ScreenPoint mouseUpPoint = e.Position;
// assuming your x-axis is at the bottom and your y-axis is at the left.
Axis xAxis = plotModel.Axes.FirstOrDefault(a => a.Position == AxisPosition.Bottom);
Axis yAxis = plotModel.Axes.FirstOrDefault(a => a.Position == AxisPosition.Left);
DateTime xstart = DateTime.FromOADate(xAxis.InverseTransform(mouseDownPoint.X));
double ystart = yAxis.InverseTransform(mouseDownPoint.Y);
DateTime xend = DateTime.FromOADate(xAxis.InverseTransform(mouseUpPoint.X));
double yend = yAxis.InverseTransform(mouseUpPoint.Y);
}
}
请注意,我还使用了更简单的转换方法重载。
另一种方法是从 'ZoomRectangleManipulator' 类派生一个类并覆盖它的“已完成”方法,但在这种情况下,我不知道您将如何从外部访问计算值。因此,这种方法对您是否有意义取决于您要实现的目标。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。