我正在使用圆形标记来指示数据点的位置。当在轴上绘制点时,我无法选择它们(使用HitTest)...但是在图表上其他任何位置绘制它们时,我都可以选择它们。不可选择的点似乎在轴的 下绘制。如果将标记变大,则可以通过单击圆的边缘来选择轴上的点。
有没有办法让标记在轴上绘制(如果那是问题!)?
答案 0 :(得分:2)
这是一个很好的问题。
这个问题确实很严重,我不知道一个简单的解决方案。
当您发现自己击中X
或Axis
或AxisLabel
时,可以修改测试的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
的过程是否就这么简单(至少除非您的ChartType
是Bubble
,就像我的;-一样)
ElementPositions
及其InnerPlotPosition
,然后将其用于覆盖。现在,您可以将系列移至第二个上方的ChartArea
,并关闭其Axis
等。HitTest
现在应该可以正常工作了。但是位置需要在每次调整大小时进行调整。