如何在大小,滚动和网格中对齐两个(或更多)图表

时间:2017-03-03 16:27:46

标签: c# winforms mschart

我有三个相同时期的信号(volgate,current和energy)。我在两个图表上打印数据:一个是电压(蓝色)和电流(红色),另一个是能量(橙色)。它们是两个不同的图形,但在实践中,它们共享相同的X轴。

我有两个光标与鼠标移动同步,它作为两个图形的一个光标,基于光标位置的工具提示显示三个信号的当前选定值(所有三个系列都有IsXValueIndexed = true,interval = 1)。如你所见,它们运作良好:

我有两个问题:

1)当我开始进行缩放时,它们在图表区域的GRID ALIGNMENT和SIZE中开始不同。注册后始终是“更改”事件的最后一点,当用户释放鼠标左键时,“更改”事件将触发并执行以下操作:我根据源名称强制缩放相反的图形。

dlChart_SelectionRangeChange(object sender, CursorEventArgs e){            
            var source = sender as Chart;
            double sp = selection_point.getStartPoint();
            double ep = selection_point.getEndPoint();
            double tmp = 0;

            if (sp == ep)
                return;
            if (sp > ep)
            {// zoom contrario
                tmp = sp;
                sp = ep;
                ep = tmp;
            }

            switch (source.ChartAreas[0].Name)
            {
                case CHARTAREA1_NAME:
                    dlChart2.ChartAreas[0].AxisX.ScaleView.Zoom(sp, ep);
                    break;
                case CHARTAREA2_NAME:
                    dlChart.ChartAreas[0].AxisX.ScaleView.Zoom(sp, ep);
                    break;
                default: break;
            }
        }

下图描述了问题:

2)在放大一个图表后,会出现一个滚动条,此时,用户只能在一个图表上更改图表视图。我想以同样的方式滚动其他图表。

我总是希望这两个图表的行为类似于一个图表。

1 个答案:

答案 0 :(得分:4)

我建议仅使用一个图表。您可以向其添加第二个ChartArea并使其成为您的第三个系列正在使用的那个。

鉴于您的x轴相同,这应该是最简单,最干净的解决方案。

要启用滚动功能,通常需要设置这些属性:

        ChartArea ca1 = chart1.ChartAreas[0];
        ChartArea ca2 = chart1.ChartAreas[1];

        Axis ax1 = ca1.AxisX;
        Axis ax2 = ca2.AxisX;

        series3.ChartArea = ca2.Name;

        ax1.ScaleView.Zoomable = true;
        ax2.ScaleView.Zoomable = true;

        ca1.CursorX.IsUserSelectionEnabled = true;
        ca2.CursorX.IsUserSelectionEnabled = true;

要保持两个ChartAreas同步,这应该足够了:

private void chart1_AxisViewChanged(object sender, ViewEventArgs e)
{
    ChartArea ca1 = chart1.ChartAreas[0];
    ChartArea ca2 = chart1.ChartAreas[1];
    Axis ax1 = ca1.AxisX;
    Axis ax2 = ca2.AxisX;

    if (e.Axis== ax1) { ax2.ScaleView.Size = ax1.ScaleView.Size;
                        ax2.ScaleView.Position = ax1.ScaleView.Position;  }
    if (e.Axis== ax2) { ax1.ScaleView.Size = ax2.ScaleView.Size;
                        ax1.ScaleView.Position = ax2.ScaleView.Position;   }
}

enter image description here