Cartesian chart: How to preserve the current zoom setting, redraw the chart, then reapply the zoom


https://www.nevron.com/Forum/Topic9517.aspx
Print Topic | Close Window

By Kevin Harrison - 8 Years Ago

Hopefully the title is self-explanatory. We have several instances where:
1) A chart is rendered and the the DataZoom tool is used to expand a specific region.
2) There is some reason to redraw the chart
3) We want the original zoom setting to be reapplied, as though the user had reused the DataZoom tool; i.e. with the ability to zoom back out to see the full chart.
What is the easiest way to achieve this? I can see that I can probably use RulerRanges to read the current zoom settings and preserve them. However, how do I "reapply" the zoom in code after redrawing the chart? If I just apply the RulerRanges I do not have the ability to zoom back out.
Thanks
Kevin

By Nevron Support - 8 Years Ago

Hi Kevin,
The easiest way to zoom back to the origin is to disable paging:

chart.Axis[StandardAxis.PrimaryX].PagingView.Enabled = false;

In order to zoom in to a specified range you can use the Zoom in method of the paging view:

chart.Axis(StandardAxis.PrimaryX).PagingView.ZoomIn(new Nevron.GraphicsCore.NRange1DD(0, 1), 0.001);

Hope this helps - let us know if you meet any problems or have any questions.

By Kevin Harrison - 8 Years Ago
Works perfectly. Thanks guys.
Kevin
By Kevin Harrison - 5 Years Ago
As an update for this, is there a way for me to know when a zoom event has completed, so I can read the ranges at this point and store them?

I tried adding code to OnEndDrag in an overridden NDataZoomTool class, but axis.Scale.RulerRange hasn't been updated at this stage. I couldn't see anything else to hook into in this class.

Thanks

Kevin
By Nevron Support - 5 Years Ago
Hi Kevin,

The scale range is recalculated when the control is recalculated. You can force recalculation when you receive the EndZoom event and then retrieve the range - for example:

  private void Form1_Load(object sender, EventArgs e)
   {
    NCartesianChart chart = (NCartesianChart)nChartControl1.Charts[0];
    chart.RangeSelections.Add(new NRangeSelection());

    NBarSeries bar = new NBarSeries();
    bar.Values.Add(10);
    bar.Values.Add(20);
    bar.Values.Add(20);
    chart.Series.Add(bar);

    nChartControl1.Controller.Tools.Add(new NPanelSelectorTool());

    NDataZoomTool dataZoomTool = new NDataZoomTool();
    dataZoomTool.EndDrag += DataZoomTool_EndDrag;
    
    nChartControl1.Controller.Tools.Add(dataZoomTool);
   }

   private void DataZoomTool_EndDrag(object sender, EventArgs e)
   {
    NDataZoomTool dataZoomTool = (NDataZoomTool)sender;

    nChartControl1.RecalcLayout();
    NRange1DD range = nChartControl1.Charts[0].Axis(StandardAxis.PrimaryX).Scale.RulerRange;

    Trace.WriteLine("X:" + range.Begin.ToString() + ", Y:" + range.End.ToString());
   }

Let us know if you meet any problems or have any questions.
By Kevin Harrison - 5 Years Ago
Thanks. My override of the tool is in a separate class so I don't have direct access to nChartControl1. What's the best way to get it form within the OnEndDrag override please?