MSChart - 2个图例可以自动堆叠在右边吗?

时间:2015-06-04 19:10:33

标签: c# .net-3.5 mschart

我在C#中动态构建图表(.Net Framework 3.5,这是MSChart的第一个版本)。该图表包括系列标识符图例和自定义项的第二个图例(数据中使用的属性表)。

默认情况下,两个图例(A& B)与主图表区域(X)并排显示,如下所示:XB A.这会导致图例下方的空间浪费,并缩小图表的大小。

我已经尝试了我能找到的选项,但即使我把B放在中心或远处,它仍然在X和A之间。有没有办法让它们自动定位在右边的垂直堆栈?那么B会自动定位在A下吗?或者我是否必须使用手动定位?

编辑:忘记提及添加(可能很关键)的细节:我没有在表单中显示图表,而是调用SaveImage()函数来编写PNG。

1 个答案:

答案 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);

    }

以下是SaveImageDrawToBitmap的两个结果:

saveimagedrawtobitmap