2016-04-15 8 views
-1

enter image description hereWie kann man Mschart-Legenden auf MouseClick abholen?

Als ich in der Legende auf ein Element klicken, wollen I ausgegeben werden Text (Die Legende der Elemente) Klicken Sie auf die „Projizierte“ Legend Artikel, Ich möchte es so gesetzt werden "Projiziert" in das Textfeld.

Gibt es eine Möglichkeit, das zu tun?

+0

Dies ist eine kurze, aber gute Frage. Leider sind alle Eigenschaften, die zur Analyse des Layouts der Legenden benötigt werden, ausgeblendet. Sie können eine benutzerdefinierte Legende erstellen und ihre Positionen berechnen, aber für die ursprüngliche Legende wäre die beste Wette eine grobe Berechnung, am besten mit ein paar Assumptins, um das Leben einfacher zu machen, so dass sie alle in einer vertikalen Reihe sind. – TaW

Antwort

0

Hier ist die grobe Berechnung ich im Kommentar erwähnt:

Zuerst haben wir eine Funktion verwenden, die die Legend.Position von Prozent in Pixel konvertiert:

RectangleF LegendClientRectangle(Chart chart, Legend L) 
{ 
    RectangleF LAR = L.Position.ToRectangleF(); 
    float pw = chart.ClientSize.Width/100f; 
    float ph = chart.ClientSize.Height/100f; 
    return new RectangleF(pw * LAR.X, ph * LAR.Y, pw * LAR.Width, ph * LAR.Height); 
} 

Als nächstes werden wir die MouseClick Code am Series zu erhalten das gehört zu der angeklickten Position:

private void chart1_MouseClick(object sender, MouseEventArgs e) 
{ 
    Point mp = e.Location; 
    Legend L = chart1.Legends[0]; 
    RectangleF LCR = LegendClientRectangle(chart1, L); 

    if (LCR.Contains(mp)) 
    { 
     int yh = (int) (LCR.Height/chart1.Series.Count); 
     int myRel = (int)(mp.Y - LCR.Y); 
     int ser = myRel/yh;    // <--- this is the series index 
     Series S = chart1.Series[ser]; // add check here! 
     // decide which you have set and want to use..: 
     string text = S.LegendText != "" ? S.LegendText : S.Name; 
     Console.WriteLine("Series # " + ser + " -> " + text); 
    } 
} 

Hinweis th Bei diesem Code wird davon ausgegangen, dass es nur eine Spalte mit Legenden ohne Extras wie einen Legendentitel gibt. Wenn das Layout mehr Spalten hat oder ein zeilenbasiertes Layout ist, müssen Sie den Code anpassen, was nicht so einfach sein kann.

Beachten Sie auch, dass der Text in einem LegendItem separat festgelegt werden oder die Standardeinstellung sein kann, dh die Series.Name. Sie sollten entweder wissen oder testen, ob der LegendText gesetzt ist!

aktualisieren

Ich frage mich, warum ich HitTest nicht einfach für meine Antwort benutzen:

private void chart1_MouseClick(object sender, MouseEventArgs e) 
{ 
    HitTestResult hit = chart1.HitTest(e.X, e.Y); 
    Series s = null; 
    if (hit != null) s = hit.Series; 
    if (s != null) 
    { 
     string text = s.LegendText != "" ? s.LegendText : s.Name; 
     Console.WriteLine("Series # " + chart1.Series.IndexOf(s) + " -> " + text); 
    } 
}