Hit-Testing Series
The Hit-Test API is set of virtual methods defined on BaseRenderableSeries, and overridden by some of the series types. This API is used by the RolloverModifier, SeriesSelectionModifier and TooltipModifier to transform mouse-clicks into data-points, and determine if a mouse-point is over a point or over a series.
To call the Hit-Test method, use the following code:
Example Title |
Copy Code
|
---|---|
// Subscribed using this code: // sciChartSurface.MouseLeftButtonUp += SciChartSurfaceMouseLeftButtonUp; private void SciChartSurfaceMouseLeftButtonUp(object sender, MouseButtonEventArgs e) { // Perform the hit test relative to the GridLinesPanel Point mousePoint = e.GetPosition(sciChartSurface.GridLinesPanel as UIElement); double datapointRadius = 8; bool useInterpolation = false; HitTestInfo result = sciChartSurface.RenderableSeries[0].HitTestProvider.HitTest(mousePoint, datapointRadius, useInterpolation); // Output results string formattedString = string.Format( "{6}:\tMouse Coord: {0:0}, {1:0}\t\tNearest Datapoint Coord: {2:0.0}, {3:0.0}\tData Value: {4:0.0}, {5:0.0}", mousePoint.X, mousePoint.Y, result.HitTestPoint.X, result.HitTestPoint.Y, result.XValue, result.YValue, result.DataSeriesName); Console.WriteLine(formattedString); } |
NOTE: You must transform any mouse-points into the coordinate space of the main chart area. Above we use the GridLinesPanel, which is a canvas in the centre of the chart viewport (inside the axes). Without this, all hit-test results will be inaccurate.
The HitTestInfo Result
The HitTestInfo struct has many properties which are useful to determine what was under the mouse. For instance:
HitTestInfo Property | Description |
NameDataSeries | The DataSeries.SeriesName of the DataSeries instance that was hit. |
HitTestPoint | A Point snapped to the X-Y coordinate of the series |
Y1HitTestPoint | A point snapped to the X-Y1 coordinate (in case of XyyDataSeries) of the series |
XValue | The DataSeries X-Value nearest to the Hit-Test Site |
YValue | The DataSeries Y-Value nearest to the Hit-Test Site |
Y1Value | The DataSeries Y1-Value (in case of XyyDataSeries) nearest to the Hit-Test Site |
ZValue | The DataSeries Z-Value (in case of XyzDataSeries) nearest to the Hit-Test Site |
DataSeriesIndex | The index to the DataSeries.XValues, YValues nearest to the Hit-Test Site |
IsHit | A Boolean flag which is True if the mouse-point was within a certain radius of an X-Y point on a series. |
IsVerticalHit | A Boolean flag which is True if the mouse-point was within a certain radius of an X point on a series. |
IsWithinDataBounds | A Boolean flag which is true if the mouse-point is between the first and last DataSeries value or not. |
ErrorHigh | The DataSeries ErrorHigh-Value (in case of HLCDataSeries) nearest to the Hit-Test Site |
ErrorLow | The DataSeries ErrorLow-Value (in case of HLCDataSeries) nearest to the Hit-Test Site |
OpenValue | The DataSeries Open-Value (in case of OhlcDataSeries) nearest to the Hit-Test Site |
HighValue | The DataSeries High-Value (in case of OhlcDataSeries) nearest to the Hit-Test Site |
LowValue | The DataSeries Low-Value (in case of OhlcDataSeries) nearest to the Hit-Test Site |
CloseValue | The DataSeries Close-Value (in case of OhlcDataSeries) nearest to the Hit-Test Site |
Minimum | The DataSeries Minimum-Value (in case of BoxPlotDataSeries) nearest to the Hit-Test Site |
Maximum | The DataSeries Maximum-Value (in case of BoxPlotDataSeries) nearest to the Hit-Test Site |
Median | The DataSeries Median-Value (in case of BoxPlotDataSeries) nearest to the Hit-Test Site |
LowerQuartile | The DataSeries LowerQuartile-Value (in case of BoxPlotDataSeries) nearest to the Hit-Test Site |
UpperQuartile | The DataSeries UpperQuartile-Value (in case of BoxPlotDataSeries) nearest to the Hit-Test Site |
Percentage | The percentage value (in case of StackedColumnRenderableSeries with Is100Percent flag set to true). |
IsEmpty() | Returns a Boolean value if the HitTestInfo struct is default (defined as empty) |
UseInterpolation Flag
The UseInterpolation flag increases the accuracy of HitTest at the expense of performance.
When used in a FastLineRenderableSeries, UseInterpolation=True will return IsHit=True if the input mouse-point is over the line, whereas if UseInterpolation=False, it will return IsHit=True only if the input mouse-point is over a data-point.
This is useful say if you wanted to show a tooltip only on datapoints (UseInterpolation=False), vs. a click event anywhere on the line (UseInterpolation=True).
For other series types, such as FastCandlestickRenderableSeries, FastColumnRenderableSeries, FastMountainRenderableSeries, setting UseInterpolation=True will result in an IsHit=True when the mouse is ‘over the series’ as opposed to ‘over the data-points’.