如何使用鼠标滚轮启用Microsoft图表控件缩放

我在我的项目中使用Microsoft Chart控件,我想通过使用鼠标滚轮在Chart Control中启用缩放function,我该如何实现?

但是用户不必点击图表,应该就像鼠标位置在我的图表上而不是从鼠标滚轮滚动它可以放大/缩小

您将要使用MouseWheel事件。

首先使图表的两个轴都可缩放:

 chart1.ChartAreas[0].AxisX.ScaleView.Zoomable = true; chart1.ChartAreas[0].AxisY.ScaleView.Zoomable = true; 

并分配事件:

 chart1.MouseWheel += chart1_MouseWheel; 

然后在事件处理程序中:

 private void chart1_MouseWheel(object sender, MouseEventArgs e) { var chart = (Chart)sender; var xAxis = chart.ChartAreas[0].AxisX; var yAxis = chart.ChartAreas[0].AxisY; try { if (e.Delta < 0) // Scrolled down. { xAxis.ScaleView.ZoomReset(); yAxis.ScaleView.ZoomReset(); } else if (e.Delta > 0) // Scrolled up. { var xMin = xAxis.ScaleView.ViewMinimum; var xMax = xAxis.ScaleView.ViewMaximum; var yMin = yAxis.ScaleView.ViewMinimum; var yMax = yAxis.ScaleView.ViewMaximum; var posXStart = xAxis.PixelPositionToValue(e.Location.X) - (xMax - xMin) / 4; var posXFinish = xAxis.PixelPositionToValue(e.Location.X) + (xMax - xMin) / 4; var posYStart = yAxis.PixelPositionToValue(e.Location.Y) - (yMax - yMin) / 4; var posYFinish = yAxis.PixelPositionToValue(e.Location.Y) + (yMax - yMin) / 4; xAxis.ScaleView.Zoom(posXStart, posXFinish); yAxis.ScaleView.Zoom(posYStart, posYFinish); } } catch { } } 

e.Delta属性告诉您已经完成了多少轮“滚动”,并且可能很有用。
向外滚动将缩小整个过程。

这可能是一种更清洁的方式,但事实确实如此。 希望这可以帮助!

我从上面修改了代码并添加了反向缩放。 因此,当您旋转鼠标滚轮时,图表会缩小。 另外我不建议使用2 ^ n作为间隔的分隔符,因为它会导致滞后。

 numberOfZoom - counter of Zooming private void Chart1_MouseWheel(object sender, MouseEventArgs e) { var chart = (Chart)sender; var xAxis = chart.ChartAreas[0].AxisX; var yAxis = chart.ChartAreas[0].AxisY; var xMin = xAxis.ScaleView.ViewMinimum; var xMax = xAxis.ScaleView.ViewMaximum; var yMin = yAxis.ScaleView.ViewMinimum; var yMax = yAxis.ScaleView.ViewMaximum; int IntervalX = 3; int IntervalY = 3; try { if (e.Delta < 0 && numberOfZoom > 0) // Scrolled down. { var posXStart = xAxis.PixelPositionToValue(e.Location.X) - IntervalX *2/ Math.Pow(2, numberOfZoom); var posXFinish = xAxis.PixelPositionToValue(e.Location.X) + IntervalX *2/ Math.Pow(2, numberOfZoom); var posYStart = yAxis.PixelPositionToValue(e.Location.Y) - IntervalY*2 / Math.Pow(2, numberOfZoom); var posYFinish = yAxis.PixelPositionToValue(e.Location.Y) + IntervalY*2 / Math.Pow(2, numberOfZoom); if (posXStart < 0) posXStart = 0; if (posYStart < 0) posYStart = 0; if (posYFinish > yAxis.Maximum) posYFinish = yAxis.Maximum; if (posXFinish > xAxis.Maximum) posYFinish = xAxis.Maximum; xAxis.ScaleView.Zoom(posXStart, posXFinish); yAxis.ScaleView.Zoom(posYStart, posYFinish); numberOfZoom--; }else if (e.Delta < 0 && numberOfZoom == 0) //Last scrolled dowm { yAxis.ScaleView.ZoomReset(); xAxis.ScaleView.ZoomReset(); } else if (e.Delta > 0) // Scrolled up. { var posXStart = xAxis.PixelPositionToValue(e.Location.X) - IntervalX / Math.Pow(2, numberOfZoom); var posXFinish = xAxis.PixelPositionToValue(e.Location.X) + IntervalX / Math.Pow(2, numberOfZoom); var posYStart = yAxis.PixelPositionToValue(e.Location.Y) - IntervalY / Math.Pow(2, numberOfZoom); var posYFinish = yAxis.PixelPositionToValue(e.Location.Y) + IntervalY / Math.Pow(2, numberOfZoom); xAxis.ScaleView.Zoom(posXStart, posXFinish); yAxis.ScaleView.Zoom(posYStart, posYFinish); numberOfZoom++; } if (numberOfZoom < 0) numberOfZoom = 0; } catch { } }