.NET图表 - 通过拖动X轴来缩放图表
我试图通过将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()。
任何帮助将是伟大的。
谢谢
已解决!
我的缩放计算基于一个假设,即像素的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;
图形控件上的“DoubleBuffer = true”是否有帮助?
我可以看到你已经解决了变焦功能,但为什么不使用内置的.NET图表放大选项?
chart.ChartAreas[0].CursorX.IsUserSelectionEnabled = true;
Michael谢谢,我需要通过拖动x轴来进行自定义缩放 – user1923248
感谢但chart1是System.Windows.Forms.DataVisualization.Charting.Chart类型,没有DoubleBuffer属性。但它不是一个双缓冲闪烁问题,它可能与我的缩放算法中的一个错误有关。 – user1923248