轴绘制点并防止在DataVisualization中进行选择

时间:2018-09-17 10:30:17

标签: c# mschart

我正在使用圆形标记来指示数据点的位置。当在轴上绘制点时,我无法选择它们(使用HitTest)...但是在图表上其他任何位置绘制它们时,我都可以选择它们。不可选择的点似乎在轴的 下绘制。如果将标记变大,则可以通过单击圆的边缘来选择轴上的点。

有没有办法让标记在轴上绘制(如果那是问题!)?

enter image description here

1 个答案:

答案 0 :(得分:2)

这是一个很好的问题。

这个问题确实很严重,我不知道一个简单的解决方案。

  • 这是一种可能的解决方法:

当您发现自己击中XAxisAxisLabel时,可以修改测试的TickMark。计算在轴上反映的位置偏移量,然后按其宽度再次进行测试。

为此,您需要知道以像素为单位的轴位置及其宽度。

后者是axis.Linewidth。对于前者,请使用轴功能ax.ValueToPixelPosition。它在y轴位置取x值。这将是x轴的“最小值”(如果已设置)或0或一些自动值,具体取决于您的数据。

这确实改善了情况,尽管我发现TickMark仍然会妨碍您前进,不确定为什么。

如果鼠标真的很靠近,用户会喜欢的,会一直增长直到再次消失。您可以使用反向函数PixelPositionToValue和一些Linq来找到最接近的点。

更新

  • 实际上,最后一个想法可以作为替代解决方法来实现。

这里是一个用于查找最接近点的函数的示例,可能在MouseMove事件中,或者在HitTest命中轴或轴元素之后。.:

DataPoint GetNearestPoint(Series s, ChartArea ca, Point pt)
{
    int limit = s.MarkerSize * 4;  // pick a suitable distance!

    Axis ay = ca.AxisY;
    Axis ax = ca.AxisX;

    var mins = s.Points.Cast<DataPoint>().Select((x, index) =>
        new
        {
            val = Math.Abs(pt.Y - (int)ay.ValueToPixelPosition(x.YValues[0]))
                    +  Math.Abs(pt.X - (int)ax.ValueToPixelPosition(x.XValue)),
            ix = index
        });

    var min = mins.Where(x => x.val == mins.Min(v => v.val)).Select(x => x.ix).First();
    if (mins.ElementAt(min).val > limit) return null;
    else return s.Points[min];
}

在创建类级变量后,我将其称为以下名称:

DataPoint lastHit = null;

当光标足够靠近时,它将为最近的点着色。.

    var nearest = GetNearestPoint(someSeries, someChart.ChartAreas[0], e.Location);
    if (lastHit != null) lastHit.MarkerColor =  someSeries.Color;
    if (nearest != null)
    {
        lastHit = nearest;
        nearest.MarkerColor = Color.Red;
    } 

放大MarkerSize的过程是否就这么简单(至少除非您的ChartTypeBubble,就像我的;-一样)

enter image description here

  • 但是另一种解决方法会很混乱:您可以添加一个额外的 ChartArea ,并将其完全覆盖。您将必须获取原始文档的ElementPositions及其InnerPlotPosition,然后将其用于覆盖。现在,您可以将系列移至第二个上方的ChartArea,并关闭其Axis等。HitTest现在应该可以正常工作了。但是位置需要在每次调整大小时进行调整。