C# MSChart-两个图例能否自动堆叠在右侧?

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下面吗?或者我必须为它们使用手动定位 编辑:忘记提到一个添加(可能

我正在用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的位置是all
0
s。这是一个非常有用的帮助。非常感谢。你的问题解决了吗?