C# MSChart-两个图例能否自动堆叠在右侧?
我正在用C#(MSChart的第一个版本是.NETFramework 3.5)动态构建一个图表。该图表包括一个系列标识符图例和自定义项的第二个图例(数据中使用的属性表) 默认情况下,两个图例(A和B)与主图表区域(X)并排显示,如下所示:X B A。这会造成图例下方的空间浪费,并减小图表的大小 我尝试过我能找到的选项,但即使我把B放在中间或远处,它仍然在X和A之间。有没有办法让它们在垂直堆栈中自动定位到右侧?那么B会自动定位在A下面吗?或者我必须为它们使用手动定位C# MSChart-两个图例能否自动堆叠在右侧?,c#,.net-3.5,mschart,C#,.net 3.5,Mschart,我正在用C#(MSChart的第一个版本是.NETFramework 3.5)动态构建一个图表。该图表包括一个系列标识符图例和自定义项的第二个图例(数据中使用的属性表) 默认情况下,两个图例(A和B)与主图表区域(X)并排显示,如下所示:X B A。这会造成图例下方的空间浪费,并减小图表的大小 我尝试过我能找到的选项,但即使我把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);
}
int pixels = 20;
float space = 100f / chart1.Height * pixels;
这将第二个图例定位在第一个图例的正下方
您可以将1(%)
添加到计算值中,以获得一点间距
如果要将其放置在高度的中间,可以将计算的Y
位置替换为50
,即固定50%
如果您希望两个图例之间有一个固定的n像素的空间
,只需按如下方式计算空间:
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);
}
int pixels = 20;
float space = 100f / chart1.Height * pixels;
并将其添加到Y值中
也可以调用setLegendPosition()代码>在创建图例之后
更新我原以为修改后的问题不会出现任何问题,但我花了一段时间才弄对
- 应该从
表单调用图表的设置。显示事件
setLegendPosition
在开始时需要一个chart.Refresh()
- 我不得不求助于
chart1.DrawToBitmap
方法,而不是使用简单的chart1.SaveImage
方法
使用(位图bmp=新位图(chart1.ClientSize.Width,chart1.ClientSize.Height))
{
图1.DrawToBitmap(bmp,图1.ClientRectangle);
保存(文件名,ImageFormat.Png)
}
以下是来自SaveImage
和DrawToBitmap
的两个结果:
! 这太棒了!除了我在问题中没有提到的一个细节之外,我不是在WinForms控件中显示它,而是直接编写PNG文件。如果我以表单形式显示图表并在显示后调整其大小,那么您的代码将非常有用。如果它没有显示在resize(通过PNG编写代码或表单的初始显示)上,当resize事件被调用时,L1的位置是all0
s。这是一个非常有用的帮助。非常感谢。你的问题解决了吗?