voir les valeurs des points du graphique lorsque la souris est sur des points

J’ai un graphique et je veux que l’utilisateur voie les valeurs lorsque le pointeur est sur les points. En utilisant l’aide de digEmAll dans la page recherchant la valeur des points d’un graphique , je pourrais écrire le code suivant:

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"; } } } 

Par le code ci-dessus, l’utilisateur peut voir les valeurs lorsque le pointeur est proche d’ une série.Mais maintenant, comment puis-je laisser l’utilisateur voir les valeurs uniquement lorsque le pointeur se trouve sur les points? j’ai remplacé

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

au lieu de

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

pour résoudre mon problème.Mais ce n’était pas utile.

Vous devriez modifier le code de cette façon:

 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); } } } } } 

L'idée est de vérifier si la souris est très proche du point, par exemple 2 pixels tout autour (car il est très peu probable qu'elle soit exactement sur le point) et d'afficher l'info-bulle dans ce cas.

Voici un exemple de travail complet.

Je prendrais cette solution:

Ajouter un gestionnaire d’événements d’infobulle personnalisé:

  this.chart1.GetToolTipText += this.chart1_GetToolTipText; 

Implémenter le gestionnaire d’événement:

  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 = ssortingng.Format("X:\t{0}\nY:\t{1}", dataPoint.XValue, dataPoint.YValues[0]); break; } } 

Considérez ce qui suit comme une meilleure option possible que les info-bulles … utilisez la fonctionnalité d’étiquette du contrôle de graphique.

 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; } } } 

J’ai testé cela et je l’utilise actuellement. C’est très bien sur les graphiques avec beaucoup de points puisqu’il montre aussi le marqueur sur le graphique.