当鼠标在点上时,查看图表点的值

我有一个图表,我希望用户在指针位于点上时看到值。 通过在页面中使用digEmAll的帮助查找图表中点的值 ,我可以编写以下代码:

Point? prevPosition = null; ToolTip tooltip = new ToolTip(); void chart1_MouseMove(object sender, MouseEventArgs e) { var pos = e.Location; if (prevPosition.HasValue && pos == prevPosition.Value) return; tooltip.RemoveAll(); prevPosition = pos; var results = chart1.HitTest(pos.X, pos.Y, false, ChartElementType.PlottingArea); foreach (var result in results) { if (result.ChartElementType == ChartElementType.PlottingArea) { chart1.Series[0].ToolTip = "X=#VALX, Y=#VALY"; } } } 

通过上面的代码,当指针靠近一个系列时,用户可以看到值。但是现在,如果指针位于点 ,我怎样才能让用户看到值? 我换了

 int k = result.PointIndex; if (k >= 0) { chart1.Series[0].Points[k].ToolTip = "X=#VALX, Y=#VALY"; } 

代替

 chart1.Series[0].ToolTip = "X=#VALX, Y=#VALY"; 

解决我的问题。但这没用。

您应该以这种方式修改代码:

 Point? prevPosition = null; ToolTip tooltip = new ToolTip(); void chart1_MouseMove(object sender, MouseEventArgs e) { var pos = e.Location; if (prevPosition.HasValue && pos == prevPosition.Value) return; tooltip.RemoveAll(); prevPosition = pos; var results = chart1.HitTest(pos.X, pos.Y, false, ChartElementType.DataPoint); foreach (var result in results) { if (result.ChartElementType == ChartElementType.DataPoint) { var prop = result.Object as DataPoint; if (prop != null) { var pointXPixel = result.ChartArea.AxisX.ValueToPixelPosition(prop.XValue); var pointYPixel = result.ChartArea.AxisY.ValueToPixelPosition(prop.YValues[0]); // check if the cursor is really close to the point (2 pixels around the point) if (Math.Abs(pos.X - pointXPixel) < 2 && Math.Abs(pos.Y - pointYPixel) < 2) { tooltip.Show("X=" + prop.XValue + ", Y=" + prop.YValues[0], this.chart1, pos.X, pos.Y - 15); } } } } } 

我们的想法是检查鼠标是否非常靠近点,例如它周围的2像素(因为它实际上不太可能完全在点上),并在这种情况下显示工具提示。

这是一个完整的工作示例。

我会采取这个解决方案:

添加自定义工具提示事件处理程序:

  this.chart1.GetToolTipText += this.chart1_GetToolTipText; 

实现事件处理程序

  private void chart1_GetToolTipText(object sender, ToolTipEventArgs e) { // Check selected chart element and set tooltip text for it switch (e.HitTestResult.ChartElementType) { case ChartElementType.DataPoint: var dataPoint = e.HitTestResult.Series.Points[e.HitTestResult.PointIndex]; e.Text = string.Format("X:\t{0}\nY:\t{1}", dataPoint.XValue, dataPoint.YValues[0]); break; } } 

将以下内容视为可能比工具提示更好的选项…使用图表控件的标签function。

 DataPoint _prevPoint; void chart1_MouseMove(object sender, MouseEventArgs e) { // this if statement clears the values from the previously activated point. if (_prevPoint) { _prevPoint.MarkerStyle = MarkerStyle.None; _prevPoint.IsValueShownAsLabel = false; } var result = chart1.HitTest(eX, eY, ChartElementType.DataPoint); if (result.ChartElementType == ChartElementType.DataPoint) { var prop = result.Object as DataPoint; if (prop != null) { prop.IsValueShownAsLabel = true; prop.MarkerStyle = MarkerStyle.Star4; } } } 

我已经测试了这个,我现在正在使用它。 它在有很多点的图表上非常好,因为它也在图表上显示了标记。