8

System.Windows.Forms.DataVisualization.Charting.Chart コントロールを使用しており、ChartArea の AxisX と Y の両方で Zoomable を true に設定しています。グラフを拡大すると、スクロールバーが表示されますが、ドラッグできません。スクロールバーをドラッグして、スクロールバー ボタンをドラッグするとチャート表示を移動させることはできますか? ユーザーにとって直感的でインタラクティブなものにしたいと考えています。ありがとう!

4

1 に答える 1

3

チャートをズームインおよびズームアウトするために、MouseWheelイベントを使用しています。以下に示す解決策は完璧にはほど遠いですが、少なくとも私にとってはうまくいきます:)。

  1. maxChangeRangeとminChangeRangeの値は、データ系列ごとに計算する必要があります(21と-1は、プロジェクトで使用した値です)。さらに、両方の軸が異なる場合に備えて、両方の軸の値の範囲が類似していると想定され、一方に何らかのスケーリングを追加する必要があります。

  2. MouseEventArgs(eXおよびeY)から受け取ったマウスの位置は、チャート内ではなくチャートコントロール内のマウスの位置であるため、この位置ズーム機能には問題があります。

  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);
于 2011-06-14T03:23:51.460 に答える