样条图,如何获取点击的item?

Spline chart, how to get the clicked item?

我正在使用 C# 处理图表。

我想知道如何让项目(样条曲线)在图表上单击以执行更改颜色或隐藏等操作。

可以按照建议使用HitTest检查点击的项目..:[=​​30=]

private void chart1_MouseDown(object sender, MouseEventArgs e)
{
    HitTestResult result = chart1.HitTest(e.X, e.Y);
    // now do what you want with the data..:
    if (result.Series != null && result.PointIndex >= 0)
        Text = "X = " + result.Series.Points[result.PointIndex].XValue + 
            "   Y = " + result.Series.Points[result.PointIndex].YValues[0];
}

为了帮助用户,您可以指出可能的命中:

private void chart1_MouseMove(object sender, MouseEventArgs e)
{
    HitTestResult result = chart1.HitTest(e.X, e.Y);
    Cursor = result.Series != null ? Cursors.Hand : Cursors.Default;
}

让样条线稍大一点,让您的用户受益:

eachOfYourSeries.BorderWidth = 4;

当然,您显示的图表在不先放大的情况下无法进行受控点击..

现在,如果您只想隐藏 Series 或更改其 Color,那么 HitTestResult 就足够了:

 result.Series.Enabled = flase;

 result.Series.Color = Color.Fuchsia;

但是要访问点击的值,可能不是..:[=​​30=]

请注意,特别是 SplineLine 图形,只需要非常 很少 DataPoints 来创建它们的线条;所以 HitTest 的结果是不够的;它 告诉您点击了哪个系列以及 最接近的 DataPoint 但要获得正确的 您可能仍然需要 将像素转换为数据值

因此,您可能更愿意使用方便的函数 PixelPositionToValue:

而不是 HitTest 结果
 float px = (float)yourChartArea.AxisX.PixelPositionToValue(e.X);

这将获取实际 DataPoints 之间的所有值。当然,您可以对 Y 值执行相同的操作:

 float py = (float)yourChartArea.AxisY.PixelPositionToValue(e.Y);

注意只能在图表不忙于确定布局时使用这些功能;正式而言,这仅在三个 Paint 事件中的任何一个期间发生。但我发现在实践中鼠标事件也可以。当图表未准备好时,您将获得空值..