MSChart - 2个图例可以自动堆叠在右边吗?
MSChart - Can 2 legends be automatically stacked on the right?
我正在用 C# 动态构建图表(.Net Framework 3.5,因此是 MSChart 的第一个版本)。该图表包括一个系列标识符图例和第二个自定义项图例(数据中使用的 table 属性)。
默认情况下,两个图例(A 和 B)与主图表区域(X)并排显示,如下所示:X B A。这会导致图例下方浪费 space 并减小图表。
我已经尝试了我能找到的选项,但即使我将 B 放在中心或远处,它仍然在 X 和 A 之间。有没有办法让它们在垂直堆叠中自动位于右侧?那么 B 会自动定位在 A 之下吗?还是我必须为他们使用手动定位?
编辑:忘记提及一个附加(可能很重要)的细节:我不是以表格形式显示图表,而是调用 SaveImage()
函数来编写 PNG。
您可以尝试这样的操作:
private void chart1_AxisViewChanged(object sender, ViewEventArgs e)
{
setLegendPosition();
}
private void chart1_Resize(object sender, EventArgs e)
{
setLegendPosition();
}
private void setLegendPosition()
{
chart1.Refresh()
Legend L1 = chart1.Legends[legendOneNameOrIndex];
Legend L2 = chart1.Legends[legendTwoNameOrIndex];
L2.Position = new ElementPosition(L1.Position.X, L1.Position.Y + L1.Position.Height,
L1.Position.Width, L1.Position.Height);
}
这将第二个图例定位在第一个图例的正下方。
您可以将 1 (%)
添加到计算值中以增加一点间距...
如果你想把它放在高度的中间,你可以用50
替换计算出的Y
位置,即固定50%
。
如果你想要在两个 Legends
之间固定 space 的 n pixels
,只需像这样计算 space:
int pixels = 20;
float space = 100f / chart1.Height * pixels;
并将其添加到 Y-Value
!
在创建 Legend
..
之后也调用 setLegendPosition();
更新 我原以为修改后的问题不会post任何问题,但我花了一些时间才正确..:[=30=]
- 应该从
Form.Shown
事件中调用图表的设置。
setLegendPosition
开头需要一个 chart.Refresh()
。
我不得不求助于 chart1.DrawToBitmap
方法,而不是使用简单的 chart1.SaveImage
。
使用(位图 bmp = 新位图(chart1.ClientSize.Width,chart1.ClientSize.Height))
{
chart1.DrawToBitmap(bmp, chart1.ClientRectangle);
bmp.Save(你的文件名, ImageFormat.Png);
}
这是 SaveImage
和 DrawToBitmap
的两个结果:
!
我正在用 C# 动态构建图表(.Net Framework 3.5,因此是 MSChart 的第一个版本)。该图表包括一个系列标识符图例和第二个自定义项图例(数据中使用的 table 属性)。
默认情况下,两个图例(A 和 B)与主图表区域(X)并排显示,如下所示:X B A。这会导致图例下方浪费 space 并减小图表。
我已经尝试了我能找到的选项,但即使我将 B 放在中心或远处,它仍然在 X 和 A 之间。有没有办法让它们在垂直堆叠中自动位于右侧?那么 B 会自动定位在 A 之下吗?还是我必须为他们使用手动定位?
编辑:忘记提及一个附加(可能很重要)的细节:我不是以表格形式显示图表,而是调用 SaveImage()
函数来编写 PNG。
您可以尝试这样的操作:
private void chart1_AxisViewChanged(object sender, ViewEventArgs e)
{
setLegendPosition();
}
private void chart1_Resize(object sender, EventArgs e)
{
setLegendPosition();
}
private void setLegendPosition()
{
chart1.Refresh()
Legend L1 = chart1.Legends[legendOneNameOrIndex];
Legend L2 = chart1.Legends[legendTwoNameOrIndex];
L2.Position = new ElementPosition(L1.Position.X, L1.Position.Y + L1.Position.Height,
L1.Position.Width, L1.Position.Height);
}
这将第二个图例定位在第一个图例的正下方。
您可以将 1 (%)
添加到计算值中以增加一点间距...
如果你想把它放在高度的中间,你可以用50
替换计算出的Y
位置,即固定50%
。
如果你想要在两个 Legends
之间固定 space 的 n pixels
,只需像这样计算 space:
int pixels = 20;
float space = 100f / chart1.Height * pixels;
并将其添加到 Y-Value
!
在创建 Legend
..
setLegendPosition();
更新 我原以为修改后的问题不会post任何问题,但我花了一些时间才正确..:[=30=]
- 应该从
Form.Shown
事件中调用图表的设置。 setLegendPosition
开头需要一个chart.Refresh()
。我不得不求助于
chart1.DrawToBitmap
方法,而不是使用简单的chart1.SaveImage
。使用(位图 bmp = 新位图(chart1.ClientSize.Width,chart1.ClientSize.Height)) { chart1.DrawToBitmap(bmp, chart1.ClientRectangle); bmp.Save(你的文件名, ImageFormat.Png);
}
这是 SaveImage
和 DrawToBitmap
的两个结果: