gpt4 book ai didi

c# - .NET 图表 - 通过拖动 X 轴缩放图表

转载 作者:行者123 更新时间:2023-11-30 15:36:09 27 4
gpt4 key购买 nike

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

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;
}
}

实际的缩放效果是通过在 HandleZoom() 中改变 AxisX 的最大值来实现的:

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

其中 'InitialAxisValue' 是初始拖动值,'e.X' 是当前鼠标 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;

关于c# - .NET 图表 - 通过拖动 X 轴缩放图表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14001340/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com