Для увеличения и уменьшения графика я использую событие MouseWheel. Решение, которое я покажу ниже, далеко не идеально, но оно работает, по крайней мере, для меня:).
Значения maxChangeRange и minChangeRange должны рассчитываться для каждого ряда данных (21 и -1 - это значения, которые я использовал в своем проекте). Кроме того, предполагается, что обе оси имеют одинаковый диапазон значений в случае, если они различаются, необходимо добавить какое-либо масштабирование для одной из них.
Позиции мыши, полученные из MouseEventArgs (e.X и e.Y), являются позициями мыши внутри элемента управления диаграммы, а не внутри Диаграммы :), поэтому эта функция позиционного масштабирования является неисправной.
Для того, чтобы это работало, вам нужно иметь элемент управления диаграммой с определенной областью диаграммы и осями
Если включена автоподгонка надписей на осях, при масштабировании диаграмма может быть немного нервной.
Я новичок в C # и мире winforms, поэтому имейте в виду, что это, вероятно, не лучшее решение.
// Actual total zoom value
int deltaScrollTotal;
private void chart_MouseWheel(object sender, MouseEventArgs e)
{
int maxChangeRange = 21;
int minChangeRange = -1;
int deltaScroll = e.Delta / Math.Abs(e.Delta);
deltaScrollTotal += deltaScrollTotal + deltaScroll > minChangeRange
&& deltaScrollTotal + deltaScroll < maxChangeRange
? deltaScroll : 0;
// Additional calculation in order to obtain pseudo
// "positional zoom" feature
double minXScale = (double)e.X / (double)chart.Width;
double maxXScale = 1 - minXScale;
double minYScale = (double)e.Y / (double)chart.Height;
double maxYScale = 1 - minYScale;
// Max and min values into which axis need to be scaled/zoomed
double maxX = chart.ChartAreas[0].AxisX.Maximum
- deltaScrollTotal * maxXScale;
double minX = chart.ChartAreas[0].AxisX.Minimum
+ deltaScrollTotal * minXScale;
double maxY = chart.ChartAreas[0].AxisY.Maximum
- deltaScrollTotal * minYScale;
double minY = chart.ChartAreas[0].AxisY.Minimum
+ deltaScrollTotal * maxYScale;
chart.ChartAreas[0].AxisX.ScaleView.Zoom( minX, maxX);
chart.ChartAreas[0].AxisY.ScaleView.Zoom( minY, maxY);
}
Это событие необходимо прикрепить к элементу управления диаграммы:
chart.MouseWheel += new MouseEventHandler(chart_MouseWheel);