【问题标题】:Get coordinates of a range using OxyPlot使用 OxyPlot 获取范围的坐标
【发布时间】:2021-02-12 04:51:45
【问题描述】:

我想从 OxyPlot PlotView 图形中读取开始和结束坐标。以下是来自 ViewModel 的代码 sn-p。

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, e1.Position.Y, yAxis).Y;
                 DateTime xend = DateTime.FromOADate(xAxis.InverseTransform(e2.Position.X, e2.Position.Y, yAxis).X);
                 double yend = yAxis.InverseTransform(e2.Position.X, e2.Position.Y, yAxis).Y;
             }
         };
     } 
};

问题是我得到的xstartystart 的值不正确,看起来y 的值只是一个随机数,而x 值在某种程度上是可以接受的。 xendyend 是正确的。 我应该在代码中更改什么,还是有其他方法可以解决这个问题?

我使用中间按钮,因为它突出显示所选区域,但我找不到简单获取该区域坐标的方法。

【问题讨论】:

  • 我认为转换本身是正确的。问题似乎是每当用户按下鼠标中键并且相同的鼠标操作也执行缩放操作时,您将一个新的事件处理程序连接到鼠标向上事件。因此,当此代码第二次运行时,鼠标向上处理程序将运行两次。它第一次运行时,我得到了正确的值。第二次轴值似乎已经改变了。
  • 这似乎是问题所在,谢谢。您对如何在不每次都创建新事件的情况下运行事件有任何建议吗?我不知道如何举办这样的活动,所以我可以得到e.Position,而无需创建新活动。
  • 这取决于你想用这些信息实现什么。我将发布最直接的方式作为答案。

标签: c# wpf oxyplot


【解决方案1】:

有几种方法可以实现这一点。您可能已经注意到绘图模型的事件被标记为过时,但它们不会在不久的将来被删除,因为如果客户需要从外部访问有关内部更改的信息,尚不清楚如何替换它们(见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' 类派生一个类并覆盖它的“已完成”方法,但在这种情况下,我不知道如何从外部访问计算值。因此,这种方法对您是否有意义取决于您要达到的目标。

【讨论】:

  • 谢谢!我会研究另一种方法。但这确实有效,所以我会将其标记为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-08
  • 1970-01-01
  • 1970-01-01
  • 2017-07-04
  • 1970-01-01
相关资源
最近更新 更多