C# 数据可视化中的轴在点上绘制和防止选择。图表

C# 数据可视化中的轴在点上绘制和防止选择。图表,c#,mschart,C#,Mschart,我使用圆形标记来指示数据点的位置。当在轴上绘制点时,我无法选择它们(使用HitTest)。。。但我可以在图表上其他地方绘制它们时选择它们。不可选择的点显示为在轴下绘制。如果我使标记变大,那么我可以通过单击圆的边缘来选择轴上的点 有没有办法让标记在轴的顶部绘制(如果有问题的话!) 这是一个非常好的问题 这个问题确实存在,我不知道一个简单的解决办法 以下是一种可能的解决方法: 当您发现您点击了轴或轴标签或勾号时,可以修改您测试的X。根据其宽度计算轴ond偏移处镜像的位置,然后再次测试 为此,您需

我使用圆形标记来指示数据点的位置。当在轴上绘制点时,我无法选择它们(使用HitTest)。。。但我可以在图表上其他地方绘制它们时选择它们。不可选择的点显示为在轴下绘制。如果我使标记变大,那么我可以通过单击圆的边缘来选择轴上的点

有没有办法让标记在轴的顶部绘制(如果有问题的话!)


这是一个非常好的问题

这个问题确实存在,我不知道一个简单的解决办法

  • 以下是一种可能的解决方法:
当您发现您点击了
轴标签
勾号
时,可以修改您测试的
X
。根据其宽度计算轴ond偏移处镜像的位置,然后再次测试

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

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

这确实改善了情况,尽管我发现记号仍然会阻碍,但我不知道为什么

如果鼠标真的离得很近,用户会喜欢鼠标长到消失。您可以使用反转功能
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];
}
当光标足够近时,它会为最近的点着色..:

    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
的过程同样简单(至少除非你的
ChartType
Bubble
,就像我的一样;-)

  • 另一个解决方法可能会相当混乱:你可以在一个额外的图表区上添加广告,并将其完全覆盖在原来的上。您必须获取原始的
    ElementPositions
    ,以及其
    InnerPlotPosition
    ElementPositions,然后将其用于覆盖。现在,您可以将序列移动到第二个上方的
    图表区域
    ,并关闭其
    等。。
    HitTest
    现在应该可以正常工作了。但每次调整大小时都需要调整位置

这是一个有趣的解决方法-我确实使用了只在选择后才增长的点,但当鼠标靠近时,这将有助于增长它们。谢谢。来自@TaW的使用最近点搜索解决方案的建议对我非常有效!
    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;
    }