.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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gelöst!
Mein zoom-Berechnung basiert auf einer Annahme, dass die X Achse Breite in Pixel fixiert ist und scheinbar, wenn die InnerPlotPosition-Eigenschaft auf TRUE festgelegt ist, wird die X Achse Breite in pixel ändern sich möglicherweise während der Laufzeit, zum Beispiel beim Zoomen.
Also die Lösung ist, um die InnerPlotPosition - Eigenschaft auf FALSE festgelegt, und legen Sie die innere Zeichnungsfläche manuell:
Ich kann sehen, dass Sie bereits gelöst mit den Zoom-Funktionen, aber warum nicht den eingebauten .net Diagramm-zoom " - option?
Bedeutet "DoubleBuffer = true" auf das Diagramm-Steuerelement helfen?