2010-05-20 67 views
6

我使用的是System.Windows.Forms.DataVisualization.Charting.Chart控件,並讓ChartArea的AxisX和Y都將Zoomable設置爲true。當圖表放大時,我看到滾動條,但不能拖動它。是否可以拖動滾動條,並讓圖表顯示隨着我拖動滾動條按鈕而移動?我想讓用戶直觀和互動。謝謝!通過拖動滾動條使DataVisualization Chart對象縮放並可滾動

+0

在問題已經回答了:http://stackoverflow.com/questions/1212914/enable-scrolling-on-the -Microsoft-圖表控制換 - 窗口的形式 – 2012-10-07 23:48:33

回答

2

爲了放大和縮小圖表我正在使用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);