如何在 MouseClick 上拾取 Mschart 图例项?
How to pick up Mschart legend item on MouseClick?
当我点击图例中的项目时,
我想输出到文本(项目的图例)
点击 "Projected" Legend Items,
我希望将其作为 "Projected" 放入文本框中。
有办法吗?
这是我在评论中提到的粗略计算:
首先我们使用一个函数将 Legend.Position
从百分比转换为像素:
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);
}
接下来我们对MouseClick
进行编码,得到属于点击位置的Series
:
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);
}
}
请注意,此代码假定只有一列 legenditems 没有像图例标题这样的额外内容。 如果布局有更多列或者是 row-based布局你将不得不调整代码,这可能不是那么简单..
另请注意,LegendItem
中的文本可以单独设置或默认设置,即 Series.Name
。您应该知道或测试是否设置了 LegendText
!
更新
我想知道为什么我不简单地使用 HitTest
作为我的答案:
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);
}
}
当我点击图例中的项目时, 我想输出到文本(项目的图例) 点击 "Projected" Legend Items, 我希望将其作为 "Projected" 放入文本框中。
有办法吗?
这是我在评论中提到的粗略计算:
首先我们使用一个函数将 Legend.Position
从百分比转换为像素:
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);
}
接下来我们对MouseClick
进行编码,得到属于点击位置的Series
:
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);
}
}
请注意,此代码假定只有一列 legenditems 没有像图例标题这样的额外内容。 如果布局有更多列或者是 row-based布局你将不得不调整代码,这可能不是那么简单..
另请注意,LegendItem
中的文本可以单独设置或默认设置,即 Series.Name
。您应该知道或测试是否设置了 LegendText
!
更新
我想知道为什么我不简单地使用 HitTest
作为我的答案:
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);
}
}