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