2010-01-13 178 views

回答

2

你想要做的缩放类型不能由MSChart自动完成。一旦您从用户那里检索到“放大”X值范围,您需要编写更多的代码来适当地重置Y轴缩放。

如果您使用的是线型数据系列,并且该系列的源数据以SortedList形式存储,则此功能最容易使用。

Dim firstXindex as Int32 = myDataSeries.IndexOfKey(firstXzoomValue) 
Dim lastXindex as Int32 = myDataSeries.IndexOfKey(lastXzoomValue)  

Dim minY as Double = 1.7E+308 
Dim maxY as Double = -1.7E+308 


For i = firstXindex To lastXindex 
    If myDataSeries.GetByIndex(i) > maxY Then 
     maxY = myDataSeries.GetByIndex(i) 
    End If 
    If myDataSeries.GetByIndex(i) < minY Then 
     minY = myDataSeries.GetByIndex(i) 
    End If 
Next 

一旦你使用像上面的代码的东西,让您MINY与美星,那么你可以使用这些值来最小和最大Y轴值重置的ChartArea:

With myChartArea 
    .AxisY.Maximum = maxY 
    .AxisY.Minimum = minY 
End With 
0

微软已经提供下载一whole range of samples。在示例应用程序中有一个名为Scrollable Appearance,它似乎可以做你想做的事。

Scrollable Appearance http://img502.imageshack.us/img502/5172/zoomablechart.png

用户可以选择和图形的面积,它会放大,也可以左右移动使用滚动条。

C#示例代码包含在下载中。

+1

这不会根据用户选择的X值范围自动放大适当的Y值范围 – ChrisAU 2010-02-18 02:34:32

3

我一直在寻找解决方案。我发现这很有用。订阅AxisValueChanged事件并使用ScaleView修改视图。

private void chart1_AxisViewChanged(object sender, ViewEventArgs e) 
    { 
     if (e.Axis.AxisName == AxisName.X) 
     { 
      int start = (int)e.Axis.ScaleView.ViewMinimum; 
      int end = (int)e.Axis.ScaleView.ViewMaximum; 

      double[] temp = chart1.Series[0].Points.Where((x, i) => i >= start && i <= end).Select(x => x.YValues[0]).ToArray(); 
      double ymin = temp.Min(); 
      double ymax = temp.Max(); 

      chart1.ChartAreas[0].AxisY.ScaleView.Position = ymin; 
      chart1.ChartAreas[0].AxisY.ScaleView.Size = ymax - ymin; 
     } 
    }