2012-05-18 9 views
11

Ich habe ein Diagramm und ich möchte, dass der Benutzer die Werte sehen, wenn der Zeiger auf den Punkten ist. Durch digEmAll Hilfe auf der Seite mit finding the value of the points in a chart, kann ich den folgenden Code schreiben:Werte der Diagrammpunkte sehen, wenn die Maus auf Punkte ist

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

durch den obigen Code, kann der Benutzer die Werte sehen, wenn der Zeiger in der Nähe von ein series.But jetzt Wie kann Ich lasse den Benutzer die Werte nur sehen, wenn der Zeiger auf die Punkte ist? ersetzt I

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

statt

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

mein problem.but es zu lösen war nicht usefull.

Antwort

18

Sie sollten den Code auf diese Weise ändern:

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

Die Idee zu prüfen ist, ob die Maus auf den Punkt sehr nahe ist z.B. 2 Pixel um es herum (denn es ist wirklich unwahrscheinlich, genau auf den Punkt) und zeigen Sie den Tooltip in diesem Fall.

Here's a complete working example.

+1

perfekt für die primäre Achse Arbeiten. Aber die Bedingung '(Math.Abs ​​(pos.X - pointXPixel) <2 && Math.Abs ​​(pos.Y - pointYPixel) <2)' schlägt für die sekundäre Achsenreihe fehl. –

+0

@RameshDurai: Ja richtig, dieser Code berücksichtigt nur die primäre Achse. – digEmAll

7

Ich würde diese Lösung nehmen:

benutzerdefinierte Quickinfo-Ereignishandler hinzu:

this.chart1.GetToolTipText += this.chart1_GetToolTipText; 

Ereignishandler implementieren:

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

Ich habe versucht, Ihren Code.Es wird ausgelöst, wenn meine Maus das Diagramm schweben, aber keine QuickInfo gezeigt hat. –

+0

@M_Mogharrabi: Ich kann es noch nicht testen, aber aus meinem Speicher: - Sie müssen die "Punktemarkierungen" zeigen - Legen Sie nicht die ToolTip-Eigenschaft des Datenpunkts, siehe https://stackoverflow.com/questions/ 14256283/show-tooltip-only-on-the-Datenpunkt-für-Linie-Graph-in-Mshart – jreichert

Verwandte Themen