2010-05-20 36 views
6

Tôi đang sử dụng điều khiển System.Windows.Forms.DataVisualization.Charting.Chart và có AxisX và Y của ChartArea cả hai đều có thể Zoomable thành true. Khi biểu đồ được phóng to, tôi thấy thanh cuộn nhưng không thể kéo nó. Có thể kéo thanh cuộn và di chuyển hiển thị biểu đồ khi tôi đang kéo nút thanh cuộn không? Tôi muốn làm cho nó trực quan và tương tác cho người dùng. Cảm ơn!Làm cho đối tượng Biểu đồ DataVisualization thu phóng và cuộn bằng cách kéo thanh cuộn

+0

trả lời trong câu hỏi: http://stackoverflow.com/questions/1212914/enable-scrolling-on-the -microsoft-chart-control-for-windows-forms –

Trả lời

2

Để phóng to và thu nhỏ biểu đồ, tôi đang sử dụng sự kiện MouseWheel. Giải pháp mà tôi sẽ hiển thị bên dưới là xa hoàn hảo nhưng nó hoạt động, ít nhất là cho tôi :).

  1. Giá trị của maxChangeRange và minChangeRange phải được tính cho mỗi chuỗi dữ liệu (21 và -1 là giá trị tôi đã sử dụng trong dự án của mình). Ngoài ra, giả sử rằng cả hai trục có phạm vi giá trị tương tự trong trường hợp nếu chúng khác nhau thì cần phải thêm một số loại tỷ lệ cho một trong số chúng.

  2. Vị trí chuột nhận được từ MouseEventArgs (e.X và e.Y) là vị trí của con chuột bên trong điều khiển biểu đồ không bên trong Biểu đồ :) vì vậy tính năng thu phóng vị trí này là loại bị lỗi.

  3. Để làm cho nó hoạt bạn cần phải có quyền kiểm soát biểu đồ với diện tích biểu đồ và trục định nghĩa

  4. Nếu trục nhãn tự động phù hợp được kích hoạt biểu đồ có thể là một chút "tăng vọt", trong khi phóng to.

  5. Tôi là người mới bắt đầu của C# và thế giới winforms vì vậy xin lưu ý rằng đây có lẽ không phải là giải pháp tốt nhất.

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

sự kiện này cần phải được gắn liền với sự kiểm soát biểu đồ:

chart.MouseWheel += new MouseEventHandler(chart_MouseWheel); 
Các vấn đề liên quan