我正在使用 System.Windows.Forms.DataVisualization.Charting.Chart 控件,并且 ChartArea 的 AxisX 和 Y 都将 Zoomable 设置为 true。放大图表时,我看到滚动条,但无法拖动它。是否可以拖动滚动条,并在我拖动滚动条按钮时移动图表显示?我想让它对用户来说直观和互动。谢谢!
问问题
6552 次
1 回答
3
为了放大和缩小图表,我正在使用 MouseWheel 事件。我将在下面展示的解决方案远非完美,但它有效,至少对我来说:)。
应该为每个数据系列计算 maxChangeRange 和 minChangeRange 的值(21 和 -1 是我在项目中使用的值)。此外,假设两个轴具有相似的值范围,如果它们不同,则需要为其中一个添加某种缩放。
从 MouseEventArgs(eX 和 eY)接收到的鼠标位置是图表控件内的鼠标位置,而不是图表内的鼠标位置 :) 所以这个位置缩放功能有点错误。
为了使其工作,您需要定义图表区域和轴的图表控件
如果启用了轴标签自动拟合,则图表在缩放时可能会有点“跳跃”。
我是 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);
于 2011-06-14T03:23:51.460 回答