.NET Charting - Zoomen eines Diagramms durch ziehen mit der X-Achse

Ich versuche, umzusetzen Diagramm Zoomen mit .NET charting-durch ziehen an einem Wert auf der X-Achse nach rechts und dann ablegen an eine neue Position. Es funktioniert, aber ich habe einige Probleme. Hier ist mein code:

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

Dem tatsächlichen Zoom-Effekt tritt durch chaging der maximale Wert der AxisX in HandleZoom():

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

wo 'InitialAxisValue' ist die erste ziehen Wert und 'e.X' ist die aktuelle Maus-x-Achse-Koordinate.

Es funktioniert, aber ich habe ein problem: manchmal ist das ziehen Bewegung ist nicht glatt, und manchmal sind Sie hin-und her zu unerwünschten Bewegungen /blinkt in der Tabelle /grid (kann man leicht finden Sie es, indem Sie die Maus langsam nach rechts).

Ist das problem wahrscheinlich in der Umsetzung von HandleZoom() und GetNewAxisMaximumValue().

Jede Hilfe wäre toll.

Dank

InformationsquelleAutor user1923248 | 2012-12-22
Schreibe einen Kommentar