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