2010-05-20 10 views
6

Sto utilizzando un controllo System.Windows.Forms.DataVisualization.Charting.Chart e ho entrambi gli assi AxisX e Y di ChartArea impostati su Zoomabile su true. Quando il grafico è ingrandito, vedo la barra di scorrimento, ma non posso trascinarla. È possibile trascinare la barra di scorrimento e spostare il display della carta mentre sto trascinando il pulsante della barra di scorrimento? Voglio renderlo intuitivo e interattivo per l'utente. Grazie!Rendi lo zoom degli oggetti del grafico DataVisualization e fai scorrere trascinando la barra di scorrimento

+0

Risposta in questione: http://stackoverflow.com/questions/1212914/enable-scrolling-on-the -Microsoft-chart-control-per-finestre-forme –

risposta

2

Per ingrandire e ridurre il grafico, sto usando l'evento MouseWheel. La soluzione che mostrerò qui sotto è tutt'altro che perfetta ma funziona, almeno per me :).

  1. Valori di maxChangeRange e minChangeRange dovranno essere calcolate per ciascuna serie di dati (21 e -1 sono valori che ho usato nel mio progetto). Inoltre, si presume che entrambi gli assi abbiano un intervallo di valori simile nel caso in cui, se sono diversi, è necessario aggiungere un tipo di ridimensionamento per uno di essi.

  2. Le posizioni del mouse ricevute da MouseEventArgs (e.X e e.Y) sono posizioni del mouse all'interno del controllo grafico non all'interno di Chart :), quindi questa funzione di zoom posizionale è in qualche modo difettosa.

  3. Per farlo funzionare è necessario avere il controllo grafico con area del grafico e assi definiti

  4. Se l'asse etichette in forma automatica è abilitata grafico può essere un po ' "nervosi", mentre lo zoom.

  5. Sono un principiante del mondo C# e winforms, quindi tieni presente che questa non è probabilmente la soluzione migliore.

    // 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); 
    } 
    

Questo evento deve essere attaccato al controllo grafico:

chart.MouseWheel += new MouseEventHandler(chart_MouseWheel); 
Problemi correlati