具有两个对齐/重叠区域的Windows窗体图表不使用整个控件

时间:2014-03-13 06:38:31

标签: windows forms charts mschart

我创建的表单上的图表有两个重叠区域。重叠部分工作得很好。问题是可见图形只占图表控件高度的一半:

enter image description here

控件的下半部分是空的(可能是因为第二个区域已经消失的区域是两个未对齐的区域?)。我无法弄清楚如何让图表使用整个控件。代码如下:

        chart1.Dock = DockStyle.Fill;
        chart1.Legends.Add(new Legend { Name = "Legend1" });
        chart1.Location = new Point(435, 3);
        chart1.Name = "chart1";
        chart1.Size = new Size(426, 287);
        chart1.TabIndex = 2;
        chart1.Text = "chart1";

        var firstArea = chart1.ChartAreas.Add("First Area");
        var seriesFirst = chart1.Series.Add("First Series");
        seriesFirst.ChartType = SeriesChartType.Line;

        seriesFirst.Points.Add(new DataPoint(10, 55));
        seriesFirst.Points.Add(new DataPoint(11, 56));
        seriesFirst.Points.Add(new DataPoint(12, 59));

        var secondArea = chart1.ChartAreas.Add("Second Area");
        secondArea.BackColor = Color.Transparent;
        secondArea.AlignmentOrientation = AreaAlignmentOrientations.All;
        secondArea.AlignmentStyle = AreaAlignmentStyles.All;
        secondArea.AlignWithChartArea = firstArea.Name;
        secondArea.AxisY.LabelStyle.Enabled = false;
        secondArea.AxisX.LabelStyle.Enabled = false;

        var seriesSecond = chart1.Series.Add("Second Series");
        seriesSecond.ChartType = SeriesChartType.Line;
        seriesSecond.ChartArea = secondArea.Name;

        seriesSecond.Points.Add(new DataPoint(10, 1001));
        seriesSecond.Points.Add(new DataPoint(11, 1015));
        seriesSecond.Points.Add(new DataPoint(12, 1016));

2 个答案:

答案 0 :(得分:1)

这是我编写的一些旧代码,并根据您的示例进行了修改。问题是InnerPlotPosition.Auto的{​​{1}}和Position.Auto状态,这就是为什么在添加第二个图表后第一个图表自动位置跳起来然后第二个图表与新ChartAreas对齐的原因1}}值。

您可以尝试将其关闭,但我认为手动定位第一个图表更容易,然后让第二个图表与新的手动位置对齐。它产生下面的图像(减去您的图例,您可以自己处理所需的值)

屁股解决方案有点痛苦,但希望它有所帮助

chart image

InnerPlotPosition.Auto

答案 1 :(得分:1)

我考虑过对这个位置进行修改,但是我必须考虑边界和图例以及其他图表组件,并假设我从来没有像图表提供的自动定位那样好 - 而且它会让我疯狂然而,TylerDurden的建议让我想到简单地推迟第二个系列/区域的添加,直到图表至少呈现一次并计算了位置之后。事实证明这是非平凡的,因为对于图表的大部分初始化,X,Y,高度和宽度仍为零。我找到的最好的方法是在Form的Shown事件中添加第二个系列:

    private void OnShown(object sender, EventArgs eventArgs)
    {
        Application.DoEvents();

        var f = chart1.ChartAreas[0].Position.ToRectangleF();

        chart1.ChartAreas[0].Position.Auto = false;
        chart1.ChartAreas[0].Position.X = f.X;
        chart1.ChartAreas[0].Position.Y = f.Y;
        chart1.ChartAreas[0].Position.Height = f.Height;
        chart1.ChartAreas[0].Position.Width = f.Width;

        // add second area/series here

需要调用Application.DoEvents()来强制图表渲染和计算位置。由于“位置”是一个百分比,因此两个图表区域将始终占据父图表的完整高度和宽度。