Workaround: use a custom ChartPanZoomController
public class MyChartPanZoomController : ChartPanZoomController
{
protected override ActionResult OnMouseWheel(MouseEventArgs e)
{
if (!(this.Area is CartesianArea))
{
return base.OnMouseWheel(e);
}
if ((Control.ModifierKeys & Keys.Control) == Keys.Control)
{
IChartView chartView = this.Area.View;
double zoomWidth = chartView.ZoomWidth;
if (this.PanZoomMode == ChartPanZoomMode.Horizontal || this.PanZoomMode == ChartPanZoomMode.Both)
{
zoomWidth += ((double)e.Delta / 1200d);
}
double zoomHeight = chartView.ZoomHeight;
if (this.PanZoomMode == ChartPanZoomMode.Vertical || this.PanZoomMode == ChartPanZoomMode.Both)
{
zoomHeight += ((double)e.Delta / 1200d);
}
zoomWidth = this.ClampValue(zoomWidth, 1d, 100d);
zoomHeight = this.ClampValue(zoomHeight, 1d, 100d);
double virtualHorizontalPosition = e.X - this.Area.AreaModel.LayoutSlot.X - chartView.PlotOriginX;
double plotAreaVirtualWidth = this.Area.AreaModel.LayoutSlot.Width * chartView.ZoomWidth;
double relativeHorizontalPosition = virtualHorizontalPosition / plotAreaVirtualWidth;
double newPlotAreaVirtualWidth = this.Area.AreaModel.LayoutSlot.Width * zoomWidth;
double newPanOffsetX = (newPlotAreaVirtualWidth * relativeHorizontalPosition) - (e.X - this.Area.AreaModel.LayoutSlot.X);
newPanOffsetX = this.ClampValue(newPanOffsetX, 0, this.Area.AreaModel.LayoutSlot.Width * (zoomWidth - 1d));
double virtualVerticalPosition = e.Y - this.Area.AreaModel.LayoutSlot.Y - chartView.PlotOriginY;
double plotAreaVirtualHeight = this.Area.AreaModel.LayoutSlot.Height * chartView.ZoomHeight;
double relativeVerticalPosition = virtualVerticalPosition / plotAreaVirtualHeight;
double newPlotAreaVirtualHeight = this.Area.AreaModel.LayoutSlot.Height * zoomHeight;
double newPanOffsetY = (newPlotAreaVirtualHeight * relativeVerticalPosition) - (e.Y - this.Area.AreaModel.LayoutSlot.Y);
newPanOffsetY = this.ClampValue(newPanOffsetY, 0, this.Area.AreaModel.LayoutSlot.Height * (zoomHeight - 1d));
this.Area.View.Zoom(zoomWidth, zoomHeight);
this.Area.View.Pan(-newPanOffsetX, -newPanOffsetY);
}
return Controller.Empty;
}
private double ClampValue(double value, double minValue, double maxValue)
{
return Math.Max(minValue, Math.Min(value, maxValue));
}
}