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

我有三个相同时期的信号(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)在放大一个图表后,会出现一个滚动条,此时,用户只能在一个图表上更改图表视图。 我想以同样的方式滚动另一个图表。

我总是希望这两个图表表现得像一个图表。

我建议只使用一个图表。 您可以向其添加第二个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; } } 

在此处输入图像描述