Сделайте объект DataVisualization Chart масштабом и прокручивайте, перетаскивая полосу прокрутки - PullRequest
7 голосов
/ 20 мая 2010

Я использую элемент управления System.Windows.Forms.DataVisualization.Charting.Chart, и для AxisX и Y в ChartArea для Zoomable установлено значение true. Когда график увеличен, я вижу полосу прокрутки, но не могу ее перетащить. Можно ли перетаскивать полосу прокрутки и перемещать отображение диаграммы, когда я перетаскиваю кнопку полосы прокрутки? Я хочу сделать его интуитивно понятным и интерактивным для пользователя. Спасибо!

1 Ответ

3 голосов
/ 14 июня 2011

Для увеличения и уменьшения графика я использую событие MouseWheel. Решение, которое я покажу ниже, далеко не идеально, но оно работает, по крайней мере, для меня:).

  1. Значения maxChangeRange и minChangeRange должны рассчитываться для каждого ряда данных (21 и -1 - это значения, которые я использовал в своем проекте). Кроме того, предполагается, что обе оси имеют одинаковый диапазон значений в случае, если они различаются, необходимо добавить какое-либо масштабирование для одной из них.

  2. Позиции мыши, полученные из MouseEventArgs (e.X и e.Y), являются позициями мыши внутри элемента управления диаграммы, а не внутри Диаграммы :), поэтому эта функция позиционного масштабирования является неисправной.

  3. Для того, чтобы это работало, вам нужно иметь элемент управления диаграммой с определенной областью диаграммы и осями

  4. Если включена автоподгонка надписей на осях, при масштабировании диаграмма может быть немного нервной.

  5. Я новичок в 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);
...