web-dev-qa-db-fra.com

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

J'ai un graphique et je veux que l'utilisateur voit les valeurs lorsque le pointeur est sur les points. En utilisant l'aide de digEmAll dans la page recherche de la valeur des points dans 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 près de une série.Mais maintenant, comment puis-je laisser l'utilisateur voir les valeurs uniquement lorsque le pointeur est 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.

15
Asma Good

Vous devez modifier le code de cette manière:

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 ex. 2 pixels autour (car il est très peu probable que soit exactement sur le point) et affiche l'info-bulle dans ce cas.

Voici un exemple de travail complet.

24
digEmAll

Je prendrais cette solution:

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

 this.chart1.GetToolTipText += this.chart1_GetToolTipText;

Implémentez le gestionnaire d'événements:

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

Considérez ce qui suit comme une meilleure option possible que les info-bulles ... utilisez la fonction d'étiquette du contrôle 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(e.X, e.Y, 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 agréable sur les graphiques avec beaucoup de points car il montre également le marqueur sur le graphique.

1
iQueue