移动鼠标时,如何显示X轴和Y轴的值 图表区域内的任何地方(如图片)?
HitTest
方法无法应用于移动,或者只能用于点击图表?
请帮帮我。提前谢谢。
答案 0 :(得分:1)
实际上Hittest
方法在MouseMove
中运行得很好;它的问题是,当你实际上超过 a DataPoint
时它才会受到打击。
Values
上的Axes
可以通过这些轴函数从像素坐标中检索/转换:
ToolTip tt = null;
Point tl = Point.Empty;
private void chart1_MouseMove(object sender, MouseEventArgs e)
{
if (tt == null ) tt = new ToolTip();
ChartArea ca = chart1.ChartAreas[0];
if (InnerPlotPositionClientRectangle(chart1, ca).Contains(e.Location))
{
Axis ax = ca.AxisX;
Axis ay = ca.AxisY;
double x = ax.PixelPositionToValue(e.X);
double y = ay.PixelPositionToValue(e.Y);
string s = DateTime.FromOADate(x).ToShortDateString();
if (e.Location != tl)
tt.SetToolTip(chart1, string.Format("X={0} ; {1:0.00}", s, y));
tl = e.Location;
}
else tt.Hide(chart1);
}
请注意,它们无效 图表正忙于布置图表元素, >>之前。 MouseMove
很好。
另请注意,示例显示原始数据,而x轴标签显示数据为DateTimes
。使用
string s = DateTime.FromOADate(x).ToShortDateString();
或类似的东西将值转换为日期!
检查是否在实际的plotarea中使用了这两个有用的功能:
RectangleF ChartAreaClientRectangle(Chart chart, ChartArea CA)
{
RectangleF CAR = CA.Position.ToRectangleF();
float pw = chart.ClientSize.Width / 100f;
float ph = chart.ClientSize.Height / 100f;
return new RectangleF(pw * CAR.X, ph * CAR.Y, pw * CAR.Width, ph * CAR.Height);
}
RectangleF InnerPlotPositionClientRectangle(Chart chart, ChartArea CA)
{
RectangleF IPP = CA.InnerPlotPosition.ToRectangleF();
RectangleF CArp = ChartAreaClientRectangle(chart, CA);
float pw = CArp.Width / 100f;
float ph = CArp.Height / 100f;
return new RectangleF(CArp.X + pw * IPP.X, CArp.Y + ph * IPP.Y,
pw * IPP.Width, ph * IPP.Height);
}
如果您愿意,可以缓存InnerPlotPositionClientRectangle
;您需要在更改数据布局或调整图表大小时这样做。