我在C#中动态构建图表(.Net Framework 3.5,这是MSChart的第一个版本)。该图表包括系列标识符图例和自定义项的第二个图例(数据中使用的属性表)。
默认情况下,两个图例(A& B)与主图表区域(X)并排显示,如下所示:XB A.这会导致图例下方的空间浪费,并缩小图表的大小。
我已经尝试了我能找到的选项,但即使我把B放在中心或远处,它仍然在X和A之间。有没有办法让它们自动定位在右边的垂直堆栈?那么B会自动定位在A下吗?或者我是否必须使用手动定位?
编辑:忘记提及添加(可能很关键)的细节:我没有在表单中显示图表,而是调用SaveImage()
函数来编写PNG。
答案 0 :(得分:2)
您可以尝试这样的事情:
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 (%)
添加到计算值中以获得一点间距......
如果您想将其置于高度的中间,可以将计算出的Y
位置替换为50
,即固定50%
。
如果你想在两个n pixels
之间使用Legends
的固定空间,只需像这样计算空间:
int pixels = 20;
float space = 100f / chart1.Height * pixels;
并将其添加到Y-Value
!
创建setLegendPosition();
..
Legend
更新我原本以为修改后的问题不会发布任何问题,但我花了一段时间才能做到正确..:
Form.Shown
事件中调用图表的设置。setLegendPosition
一开始需要chart.Refresh()
。我不得不使用简单的chart1.SaveImage
,而是使用chart1.DrawToBitmap
方法。
使用(位图bmp =新位图(chart1.ClientSize.Width,chart1.ClientSize.Height)) { chart1.DrawToBitmap(bmp,chart1.ClientRectangle); bmp.Save(yourfilename,ImageFormat.Png);
}
以下是SaveImage
和DrawToBitmap
的两个结果:
!