如何修改 C# 图表控件的图表区百分比。

9
如果我有一个包含2个chartAreas的图表控件,默认情况下,图表控件会将这两个区域叠放在一起,并使每个区域占用图表控件可用大小的50%。
是否有一种方法可以更改chartAreas的百分比,以便我可以让顶部图表占据75%的区域,底部图表占据25%的区域?

1
@Peretz 对于这部分,我正在使用设计师来生成图表。虽然我可以复制那段代码,但我不确定它是否有帮助。它只是一个带有2个chartAreas的标准图表。没有我的任何代码会影响它,只有设计师。我正在尝试看看是否有人知道如何编写此代码。 - Xantham
2个回答

13

所以,我最终找到了它,但我认为它的文档记录不是很好。每个chartArea都有属性ChartArea.Position。该属性的类型为ElementPosition,包含4个与此问题相关的属性:

Height:获取或设置图表元素的高度。
Width:获取或设置图表元素的宽度。
X:获取或设置适用图表元素左上角相对 X 坐标。
Y:获取或设置适用图表元素左上角相对 Y 坐标。

当您深入了解时,HeightWidth属性也是以相对坐标的形式呈现,因此您只能输入0-100之间的数字。

基本上,您必须更改每个高度和每个Y以移动它们。在初始创建之后,它不会自动调整其他数字。

例如,如果我只更改chartArea [1]的Height为较小的值,则它仍将锚定在先前的位置,这是有道理的,留下大量白色空间。

然后,如果我增加chartArea [0]的Height,它可能会绘制在我们刚刚调整大小的chartArea [1]上。因此,我必须设置chartArea [1]的Y向下移动,以便它不会被覆盖,并且白色空间消失了。

所以,要获得与我在问题中提出的类似的东西,我将其设置为:

chart1.ChartAreas[0].Position.Y = 10;
chart1.ChartAreas[0].Position.Height = 60;
chart1.ChartAreas[1].Position.Y = 70;
chart1.ChartAreas[1].Position.Height = 20;
为了更清晰地解释,我将把包含这些chartAreas的Chart控件称为“父级”。这些是百分比值,但以本示例而言,让我们假设父级的大小为100像素。
这将使第一个chartArea从10像素开始显示,并使其高度约为60像素。然后在70像素处开始显示第二个chartArea,并使其高度约为20像素。

如果此图表高度为200像素,则比例相同,但实际像素会增加一倍(因此将第一个chart area设置为60将使其高度为120像素)。我在我的真实程序中进行了更多的填充,因为标题覆盖了轴标签,但我觉得这些数字有助于更好地解释它。

如果在用户看不到图表的情况下执行此操作,它会破坏图表(我将我的图表放在单独的TabPage上,只有在图表呈现给用户后调用才能正常工作)。 - Ivan
到目前为止,我能找到的唯一适当的位置(产生正确结果)是chart_Paint事件处理程序(但不是PrePaint / PostPaint或任何其他地方)。但是,当取消最大化窗口时,它会产生一些可见的垃圾。 - Ivan
我能得到的最好结果是将其放置在同一TabPage上另一个控件的Paint事件处理程序中,但仍然不完美,而且似乎有点脏。 - Ivan

3
你还可以将第二个图表的Y位置设置为第一个图表的底部,这样你只需要关心第一个图表的位置即可。代码看起来像这样:
chart1.ChartAreas[0].Position.Y = 10;
chart1.ChartAreas[0].Position.Height = 60;
chart1.ChartAreas[1].Position.Y = chart1.ChartAreas[0].Position.Bottom;
chart1.ChartAreas[1].Position.Height = 20;

当然,您也可以填充.Y位置,这取决于您需要在图表之间留多少空白。我曾经利用这种方法为我的应用程序构建了多个图表,并确保每个图表都能正确定位,无论对单个图表做了什么操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接