【问题标题】:Make DataVisualization Chart object zoom and scrollable by dragging the scroll bar通过拖动滚动条使 DataVisualization Chart 对象可缩放和可滚动
【发布时间】:2011-06-14 11:23:51
【问题描述】:

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

【问题讨论】:

标签: .net charts data-visualization


【解决方案1】:

为了放大和缩小图表,我正在使用 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);

【讨论】:

    猜你喜欢
    • 2013-11-20
    • 2020-05-14
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 2023-03-16
    • 2011-07-06
    • 1970-01-01
    • 2021-10-22
    相关资源
    最近更新 更多