C#中的chart控件,是非常适合用来绘图的。当想查看数据的细节时,可以设置chart控件的放大缩小功能,一般该功能是和滚动条一块使用的。
比如我现在想查看圆圈处的数据的细节,那么添加以下语句就可以执行放大功能以查看数据的细节
chart1.ChartAreas[0].CursorX.IsUserSelectionEnabled = true;
chart1.ChartAreas[0].CursorY.IsUserSelectionEnabled = true;
当看完细节后又想看全局数据时,那么这时我们就需要实行缩小功能,可以使用chart中的ZoomReset(int numberOfViews)函数执行缩小功能,其中的参数是要重置的缩放操作数。一般我们都是一步一步放大缩小,那么该函数的使用就是 ZoomReset(1),表示重置1次缩放操作。
//该语句表示重置X轴的一次缩放操作
chart1.ChartAreas[0].AxisX.ScaleView.ZoomReset(1);
上面两张图片就展示了放大和缩小后的效果。
但是这里有个问题,那就是当我放大查看数据后,并且用滚动条拖动数据到其他位置,再重置缩放操作时,视图位置会回到前一步执行放大操作的视图位置。
当前在00:08:00执行了放大视图操作
在该视图下,使用滚动条拖动数据至02:29:00
执行重置缩放操作后,视图位置又回到了00:08:00处,也就是执行放大操作时的视图位置。
这样对我们的使用就非常的不方便,所以如何解决这个问题呢?如何在执行重置缩放操作后,视图位置仍能定位到我们当前查看的视图位置呢?其实解决方法也很简单,那就是控制chart控件视图的位置,即控制
chart1.ChartAreas[0].AxisX.ScaleView.Position
的值。
那么要如何控制呢,只需要用一个定位点来确定便解决了。
现在我用当前X轴视图的中间点来当做定位点(02:28:00),为了执行重置缩放操作后,该定位点仍旧是重置缩放操作后的中间点(通俗讲就是视图位置还是在这个定位点处),那么添加以下代码便可以实现了
//用变量x记录下定位点的x值,也就是当前X轴视图的中间位置
double x = (chart1.ChartAreas[0].AxisX.ScaleView.ViewMaximum + chart1.ChartAreas[0].AxisX.ScaleView.ViewMinimum) / 2;
//执行一次重置缩放操作
chart1.ChartAreas[0].AxisX.ScaleView.ZoomReset(1);
//将X轴视图位置重新定位。用x的值减去新的X轴视图大小的一半,即为新的X轴视图定位
chart1.ChartAreas[0].AxisX.ScaleView.Position = x - (chart1.ChartAreas[0].AxisX.ScaleView.ViewMaximum - chart1.ChartAreas[0].AxisX.ScaleView.ViewMinimum) / 2;
//这里要注意,要控制视图定位在X轴的最大最小值之间,不然视图位置就跑到数据外面去了
if (chart1.ChartAreas[0].AxisX.ScaleView.Position < chart1.ChartAreas[0].AxisX.Minimum)
chart1.ChartAreas[0].AxisX.ScaleView.Position = chart1.ChartAreas[0].AxisX.Minimum;
if (chart1.ChartAreas[0].AxisX.ScaleView.ViewMaximum > chart1.ChartAreas[0].AxisX.Maximum)
chart1.ChartAreas[0].AxisX.ScaleView.Position = chart1.ChartAreas[0].AxisX.Maximum - (chart1.ChartAreas[0].AxisX.ScaleView.ViewMaximum chart1.ChartAreas[0].AxisX.ScaleView.ViewMinimum);
执行重置缩放操作,可以看到,X轴的视图位置仍是以(02:28:00)为中心,并没有回到之前的(00:08:00)附近,问题完美解决。
源代码下载