首页 文章

通过拖动滚动条使DataVisualization Chart对象可以缩放和滚动

提问于
浏览
7

我正在使用System.Windows.Forms.DataVisualization.Charting.Chart控件,并让ChartArea的AxisX和Y都将Zoomable设置为true . 当图表放大时,我会看到滚动条,但无法拖动它 . 是否可以拖动滚动条,并在拖动滚动条按钮时让图表显示移动?我希望为用户提供直观和互动的功能 . 谢谢!

1 回答

  • 3

    为了放大和缩小图表我正在使用MouseWheel事件 . 我将在下面展示的解决方案远非完美,但它起作用,至少对我而言:) .

    • 应为每个数据系列计算maxChangeRange和minChangeRange的值(21和-1是我在项目中使用的值) . 另外,假设两个轴具有相似的值范围,如果它们不同则需要为它们中的一个添加某种缩放 .

    • 从MouseEventArgs(e.X和e.Y)接收的鼠标位置是图表控件内的鼠标位置,而不是图表:),因此这种位置缩放功能有点错误 .

    • 为了使其工作,您需要定义图表区域和轴的图表控件

    • 如果启用了轴标签自动调整,则在缩放时图表可能会有点“跳跃” .

    • 我是C#的初学者并且赢得了世界,所以请记住,这可能不是最佳解决方案 .

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

相关问题