【问题标题】:Oxyplot - edit the left-click label in a LineSeriesOxyplot - 编辑 LineSeries 中的左键单击标签
【发布时间】:2018-11-20 14:12:16
【问题描述】:

我在 Oxyplot 中绘制了几个不同的 LineSeries(在 C# 中,使用 Windows 窗体),它们的范围都大不相同。为了使每个系列仍然可见,我将它们的所有值缩放到从 0 到 1 的范围内。当然这里的问题是,不能再显示系列的实际值,所以我想知道是否有可能更改显示 DataPoint 的 X 和 Y 值的左键单击事件以解决此问题。如果可能的话,我希望当用户点击一个数据点时,显示的 Y 值将按比例缩小到原始值,而图形保持按比例缩小。

例如,我有一个从 130 到 150 的 Na+ 值,然后我将其缩放为 0 和 1。但是当用户单击数据点时,我希望它显示 Y = 140 而不是 0.5。由于每个 LineSeries 都有不同的比例因子,这也意味着我必须分别编辑每个系列的标签。

所以是的,在当前版本中是否可能出现类似的情况?提前致谢!

编辑:我想通了,请参阅下面的答案!

【问题讨论】:

  • 我想在绘图中显示实际值会相当困难,但也许你可以听鼠标事件,获取绘图值并从中计算回实际值并显示它们在文本框或标签中?
  • 啊,那么从事件中获取绘图值,然后隐藏跟踪器并将其显示在 insted 的标签中?如果我能找出鼠标事件在哪里,我会尝试作为 B 计划。谢谢!
  • 把这个作为答案,让我知道这是否适合你。

标签: c# winforms oxyplot tracker


【解决方案1】:

我不确定我是否应该回答我自己的问题,但我最终弄明白了。所以无论如何,事实证明我无法访问任何所需的属性,所以我只是为数据点创建了自己的类,并包含了一个用于缩放值的属性。原来Tracker能够显示Datapoints的其他属性,但是标准Datapoints只有X和Y。然后我修改了TrackerFormatString以显示缩放值而不是实际值。

        public class MeasurePoint : IDataPointProvider
    {
        public MeasurePoint(double x, double y, double scale)
        {
            X = x; Y = y; Scale = scale;
        }

        public double X { get; set; }
        public double Y { get; set; }
        public double Scale { get; set; }
        public DataPoint GetDataPoint()
        {
            return new DataPoint(X, Y);
        }
    }

这是我创建的课程,这就是我最终处理分数的方式。

            var points = new MeasurePoint[Y.Count - 1];
        for (int i = 0; i < Y.Count; i++)
        {
            points[i] = new MeasurePoint(DateTimeAxis.ToDouble(X[i]), Y[i], Y[i]*scale);
        }
        Series.ItemsSource = points;
        Series.TrackerFormatString = "{0}\n{2}\n{Scale}";

这里的比例是我在绘制之前将值除以的因子,TrackerFormatString 是 {0} 系列名称,{2} 是 X 值。

效果很好!

【讨论】:

    【解决方案2】:

    您不能直接更改显示的数据,但是您可以像这样在 oxyplot 中监听 mousedown 事件:

    var model= new PlotModel();
    model.MouseDown += Model_MouseDown;
    
    private void Model_MouseDown(object sender, OxyMouseDownEventArgs e)
    {
        var controller = sender as PlotController;
        var position = e.HitTestResult;
    }
    

    使用position 的值,您可以计算回实际值并将其显示在其他地方。

    【讨论】:

    • 啊,是的,这行得通,谢谢!所以现在我在位置对象中拥有了 X/Y 值以及它们属于哪些 LineSeries,我只是想弄清楚如何访问这些属性。我需要向 Oxyplot.HitTestResult 类添加任何 get 方法吗?
    • 嗯,抱歉,我无法测试任何代码 atm。不能给位置 x 和 y 的值分配一个新变量吗?
    • 调试时可以看到 X 和 Y 值,但无法访问代码中的属性。我尝试了类似 var x = position.X 的方法,如果这就是你的意思的话。
    • 这很奇怪,根据sourcefiles HitTestResults 属性应该是公开的。 [ ScreenPoint.XScreenPoint.Y ](github.com/ylatuya/oxyplot/blob/master/Source/OxyPlot/…) 也是如此。您是否尝试过访问索引?原则上,这就是您所需要的。 (对不起,我也只是对此做了一个简短的调试测试,直到明天才能查看代码。
    • 是的,我也这么认为,但我似乎无法访问 HitTestResult.Item.X。索引有效,谢谢,虽然我仍然需要 position.Element.Title 属性来知道单击属于哪个 LineSeries 并且那个似乎也无法访问。我是否必须以某种方式编辑源文件并公开这些属性?我试图找出方法和位置,但我似乎无法找到正确的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 2015-10-03
    • 2012-09-02
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多