2012-12-22 38 views
3

我试图通过将X轴上的值拖动到右侧然后将其放到新位置来实现使用.NET图表的图表缩放。它有点工作,但我有一些问题。这是我的代码:.NET图表 - 通过拖动X轴来缩放图表

AxisX.Maximum = GetNewAxisMaximumValue(e.X, InitialAxisValue); 

其中“InitialAxisValue”是初始拖拽值和“EX”是:通过换款AxisX在HandleZoom()的最大值出现

public partial class ChartForm : Form 
{ 
    public ChartForm() 
    { 
     InitializeComponent(); 
    } 

    private Axis AxisX { get; set; } 
    private double InitialAxisValue { get; set; } 

    protected override void OnLoad(EventArgs e) 
    { 
     chart1.Series.Add(CreateDataSeries()); 
     AxisX = chart1.ChartAreas[0].AxisX; 
     InitialAxisValue = double.NaN; 
     chart1.MouseMove += OnChartMouseMove; 
     chart1.MouseDown += OnChartMouseDown; 
     chart1.MouseUp += OnChartMouseUp; 
    } 

    private static Series CreateDataSeries() 
    { 
     var dataSeries = new Series 
          { 
           ChartType = SeriesChartType.Line, 
          }; 

     for (double spotPrice = 1100; spotPrice < 1300; spotPrice++) 
     { 
      dataSeries.Points.Add(new DataPoint(spotPrice, spotPrice)); 
     } 

     return dataSeries; 
    } 

    private void OnChartMouseUp(object sender, MouseEventArgs e) 
    { 
     InitialAxisValue = double.NaN; 
    } 

    private void OnChartMouseDown(object sender, MouseEventArgs e) 
    { 
     if (!MouseOnXAxis(e.X, e.Y)) 
      return; 

     double valueX = AxisX.PixelPositionToValue(e.X); 
     InitialAxisValue = valueX; 
    } 

    private void OnChartMouseMove(object sender, MouseEventArgs e) 
    { 
     try 
     { 
      Cursor = MouseOnXAxis(e.X, e.Y) ? Cursors.Hand : Cursors.Default; 
      HandleZoom(e); 
     } 
     catch (Exception exception) 
     { 
      Console.WriteLine(exception); 
     } 
    } 

    private void HandleZoom(MouseEventArgs e) 
    { 
     if (double.IsNaN(InitialAxisValue)) 
      return; 

     AxisX.Maximum = GetNewAxisMaximumValue(e.X, InitialAxisValue); 
    } 

    private double GetNewAxisMaximumValue(double currentAxisCoordinate, 
              double initialAxisZoomPointValue) 
    { 
     double axisMinimumValue = AxisX.Minimum; 
     double axisMaximumValue = AxisX.Maximum; 
     double axisMinimumCoordinate = AxisX.ValueToPixelPosition(axisMinimumValue); 
     double axisMaximumCoordinate = AxisX.ValueToPixelPosition(axisMaximumValue); 
     double relativePos = (currentAxisCoordinate - axisMinimumCoordinate)/
          (axisMaximumCoordinate - axisMinimumCoordinate); 
     double newAxisWidth = ((initialAxisZoomPointValue - axisMinimumValue)/relativePos); 
     return axisMinimumValue + newAxisWidth; 
    } 

    private bool MouseOnXAxis(int xCoor, int yCoor) 
    { 
     HitTestResult hitTestResult = chart1.HitTest(xCoor, yCoor); 
     return hitTestResult.ChartElementType == ChartElementType.AxisLabels && 
       hitTestResult.Axis == AxisX; 
    } 
} 

实际变焦效果当前鼠标的x轴坐标。

它的工作原理,但我有一个问题:有时拖动运动不平滑,有时会有图表/网格中出现不期望的运动/眨眼(您可以通过将鼠标慢慢地向右拖动来轻松看到它) 。

该问题可能是在执行HandleZoom()和GetNewAxisMaximumValue()。

任何帮助将是伟大的。

谢谢

回答

2

已解决

我的缩放计算基于一个假设,即像素的X轴宽度是固定的,显然当InnerPlotPosition属性设置为TRUE时,像素中的X轴宽度可能会在运行时更改(例如缩放时)。

因此,解决方案是将InnerPlotPosition属性设置为false,手动设置内部绘图区:

 chart1.ChartAreas[0].InnerPlotPosition.Auto = false; 
     chart1.ChartAreas[0].InnerPlotPosition.Height = 80.29209F; 
     chart1.ChartAreas[0].InnerPlotPosition.Width = 85F; 
     chart1.ChartAreas[0].InnerPlotPosition.X = 15F; 
     chart1.ChartAreas[0].InnerPlotPosition.Y = 5.07246F; 
0

图形控件上的“DoubleBuffer = true”是否有帮助?

+0

感谢但chart1是System.Windows.Forms.DataVisualization.Charting.Chart类型,没有DoubleBuffer属性。但它不是一个双缓冲闪烁问题,它可能与我的缩放算法中的一个错误有关。 – user1923248

2

我可以看到你已经解决了变焦功能,但为什么不使用内置的.NET图表放大选项?

chart.ChartAreas[0].CursorX.IsUserSelectionEnabled = true; 
+0

Michael谢谢,我需要通过拖动x轴来进行自定义缩放 – user1923248