/// <summary> /// Method is used to raises the selection changing event. /// </summary> /// <param name="newIndex">The New Index</param> /// <param name="oldIndex">The Old Index</param> /// <returns>Returns a <see cref="bool"/> property to indicate the argument cancel.</returns> internal override bool RaiseSelectionChanging(int newIndex, int oldIndex) { selectionChangingEventArgs.SelectedSegments = null; if (this is AreaSeries3D || this is LineSeries3D) { selectionChangingEventArgs.SelectedSegment = this.GetDataPoint(newIndex); } else { if (newIndex >= 0 && newIndex < Segments.Count) { selectionChangingEventArgs.SelectedSegment = this.Segments[newIndex]; } else { selectionChangingEventArgs.SelectedSegment = null; } } this.SetSelectionChangingEventArgs(newIndex, oldIndex); ActualArea.OnSelectionChanging(this.selectionChangingEventArgs); return(selectionChangingEventArgs.Cancel); }
protected override void OnPointerMoved(PointerRoutedEventArgs e) { Canvas canvas = ActualArea.GetAdorningCanvas(); mousePos = e.GetCurrentPoint(canvas).Position; if (e.Pointer.PointerDeviceType != Windows.Devices.Input.PointerDeviceType.Touch) { UpdateTooltip(e.OriginalSource); } }
protected override void OnPointerMoved(PointerRoutedEventArgs e) { if (ShowTooltip) { Canvas canvas = ActualArea.GetAdorningCanvas(); mousePos = e.GetCurrentPoint(canvas).Position; ChartDataPointInfo dataPoint = new ChartDataPointInfo(); int index = ChartExtensionUtils.GetAdornmentIndex(e.OriginalSource); if (index > -1) { if (ActualXAxis is CategoryAxis && !(ActualXAxis as CategoryAxis).IsIndexed) { if (xValues.Count > index) { dataPoint.XData = GroupedXValuesIndexes[index]; } if (GroupedSeriesYValues[0].Count > index) { dataPoint.YData = GroupedSeriesYValues[0][index]; } dataPoint.Index = index; dataPoint.Series = this; if (ActualData.Count > index) { dataPoint.Item = GroupedActualData[index]; } } else { if (xValues.Count > index) { dataPoint.XData = xValues[index]; } if (YValues.Count > index) { dataPoint.YData = YValues[index]; } dataPoint.Index = index; dataPoint.Series = this; if (ActualData.Count > index) { dataPoint.Item = ActualData[index]; } } UpdateSeriesTooltip(dataPoint); } } }
protected override void OnPointerMoved(PointerRoutedEventArgs e) { if (ShowTooltip && e.OriginalSource is Polyline) { Canvas canvas = ActualArea.GetAdorningCanvas(); mousePos = e.GetCurrentPoint(canvas).Position; ChartDataPointInfo dataPointInfo = GetCurveDataPoint(mousePos, (e.OriginalSource as Polyline).Tag); UpdateSeriesTooltip(dataPointInfo); } else { base.OnPointerMoved(e); } }
private ChartDataPointInfo GetCurveDataPoint(Point mousePos, object tag) { hitPoint.X = mousePos.X - this.Area.SeriesClipRect.Left; hitPoint.Y = mousePos.Y - this.Area.SeriesClipRect.Top; // Calculate the bounds region from the area width & height double x = Math.Floor(Area.SeriesClipRect.Width * 0.025); double y = Math.Floor(Area.SeriesClipRect.Height * 0.025); hitPoint.X = hitPoint.X - x; hitPoint.Y = hitPoint.Y - y; startPoint.X = ActualArea.PointToValue(ActualXAxis, hitPoint); startPoint.Y = ActualArea.PointToValue(ActualYAxis, hitPoint); hitPoint.X = hitPoint.X + (2 * x); hitPoint.Y = hitPoint.Y + (2 * y); endPoint.X = ActualArea.PointToValue(ActualXAxis, hitPoint); endPoint.Y = ActualArea.PointToValue(ActualYAxis, hitPoint); Rect rect = new Rect(startPoint, endPoint); dataPoint = null; PointCollection distributionPoints = (tag as HistogramDistributionSegment).distributionPoints; for (int i = 0; i < distributionPoints.Count; i++) { hitPoint.X = distributionPoints[i].X; hitPoint.Y = distributionPoints[i].Y; if (rect.Contains(hitPoint)) { dataPoint = new ChartDataPointInfo(); dataPoint.Index = i; dataPoint.XData = distributionPoints[i].X; dataPoint.YData = distributionPoints[i].Y; dataPoint.Series = this; if (i > -1 && ActualData.Count > i) { dataPoint.Item = ActualData[i]; } break; } } return(dataPoint); }
/// <summary> /// Invoke to render SfChart /// </summary> protected override void OnApplyTemplate() { base.OnApplyTemplate(); AdornmentPresenter = this.GetTemplateChild("adornmentPresenter") as ChartAdornmentPresenter; SeriesRootPanel = this.GetTemplateChild("PART_SeriesRootPanel") as Panel; SeriesPanel = this.GetTemplateChild("seriesPanel") as ChartSeriesPanel; SeriesPanel.Series = this; /* In case of stacking series, we position the corresponding adornments above series panel, * we have specifically checked for adornments position as bottom to show adornment label for next series*/ var stackingSeriesBase = this as StackingSeriesBase; if (stackingSeriesBase != null) { if (this is FastStackingColumnBitmapSeries) // WPF-19742-We have specifically checked this condition for stacking bitmap series. { return; } if (stackingSeriesBase.IsSideBySide) { if (adornmentInfo != null) { switch (adornmentInfo.AdornmentsPosition) { case AdornmentsPosition.TopAndBottom: case AdornmentsPosition.Top: Canvas.SetZIndex(SeriesPanel.Series, -ActualArea.GetSeriesIndex(this)); break; default: Canvas.SetZIndex(SeriesPanel.Series, ActualArea.GetSeriesIndex(this)); break; } } } else { Canvas.SetZIndex(SeriesPanel.Series, -ActualArea.GetSeriesIndex(this)); } } }
private void SetTooltipSegmentItem(StepLineSegment lineSegment) { double xVal = 0; double yVal = 0; double stackValue = double.NaN; var point = new Point(mousePos.X - this.Area.SeriesClipRect.Left, mousePos.Y - this.Area.SeriesClipRect.Top); FindNearestChartPoint(point, out xVal, out yVal, out stackValue); if (double.IsNaN(xVal)) { return; } if (lineSegment != null) { lineSegment.YData = yVal == lineSegment.Y1Value ? lineSegment.Y1Value : lineSegment.Y1Data; } var segmentIndex = this.GetXValues().IndexOf(xVal); if (!IsIndexed) { IList <double> xValues = this.ActualXValues as IList <double>; int i = segmentIndex; double nearestY = this.ActualSeriesYValues[0][i]; while (xValues.Count > i && xValues[i] == xVal) { double yValue = ActualArea.PointToValue(ActualYAxis, point); var validateYValue = ActualSeriesYValues[0][i]; if (Math.Abs(yValue - validateYValue) <= Math.Abs(yValue - nearestY)) { segmentIndex = i; nearestY = validateYValue; } i++; } } lineSegment.Item = this.ActualData[segmentIndex]; }
/// <summary> /// Method used to set SegmentSelectionBrush to selectedindex chartsegment /// </summary> /// <param name="newIndex"/> /// <param name="oldIndex"/> protected internal override void SelectedIndexChanged(int newIndex, int oldIndex) { CircularSeriesBase circularseries = this as CircularSeriesBase; bool isGroupTo = circularseries != null && !double.IsNaN(circularseries.GroupTo); ChartSelectionChangedEventArgs chartSelectionChangedEventArgs; if (ActualArea != null && ActualArea.SelectionBehaviour != null) { ChartSegment selectedSegment = null, oldSegment = null; // Reset the oldIndex segment Interior if (ActualArea.SelectionBehaviour.SelectionStyle == SelectionStyle.Single) { if (SelectedSegmentsIndexes.Contains(oldIndex)) { SelectedSegmentsIndexes.Remove(oldIndex); } OnResetSegment(oldIndex); } if (oldIndex != -1 && oldIndex < ActualData.Count) { object oldItem = isGroupTo ? Segments[oldIndex].Item : ActualData[oldIndex]; oldSegment = Segments.Where(segment => segment.Item == oldItem).FirstOrDefault(); } if (newIndex >= 0 && ActualArea.GetEnableSegmentSelection()) { if (!SelectedSegmentsIndexes.Contains(newIndex)) { SelectedSegmentsIndexes.Add(newIndex); } if (Segments.Count == 0) { triggerSelectionChangedEventOnLoad = true; return; } if (newIndex < Segments.Count || newIndex < ActualData.Count) { // For adornment selection implementation if (adornmentInfo is ChartAdornmentInfo && adornmentInfo.HighlightOnSelection) { UpdateAdornmentSelection(newIndex); } // Set the SegmentSelectionBrush to newIndex segment Interior if (this is ISegmentSelectable) { object newItem = isGroupTo ? Segments[newIndex].Item : ActualData[newIndex]; selectedSegment = Segments.Where(segment => segment.Item == newItem).FirstOrDefault(); if (selectedSegment != null) { if (this.SegmentSelectionBrush != null) { selectedSegment.BindProperties(); } selectedSegment.IsSelectedSegment = true; } } } if (newIndex < Segments.Count || newIndex < ActualData.Count) { chartSelectionChangedEventArgs = new ChartSelectionChangedEventArgs() { SelectedSegment = selectedSegment, SelectedSegments = Area.SelectedSegments, SelectedSeries = this, SelectedIndex = newIndex, PreviousSelectedIndex = oldIndex, PreviousSelectedSegment = oldSegment, NewPointInfo = selectedSegment != null ? selectedSegment.Item : null, OldPointInfo = oldSegment != null ? oldSegment.Item : null, PreviousSelectedSeries = null, IsSelected = true }; if (this.ActualArea.PreviousSelectedSeries != null && oldIndex != -1) { chartSelectionChangedEventArgs.PreviousSelectedSeries = this.ActualArea.PreviousSelectedSeries; } (ActualArea as SfChart).OnSelectionChanged(chartSelectionChangedEventArgs); PreviousSelectedIndex = newIndex; } } else if (newIndex == -1) { chartSelectionChangedEventArgs = new ChartSelectionChangedEventArgs() { SelectedSegment = null, SelectedSegments = Area.SelectedSegments, SelectedSeries = null, SelectedIndex = newIndex, PreviousSelectedIndex = oldIndex, PreviousSelectedSegment = oldSegment, NewPointInfo = null, OldPointInfo = oldSegment.Item, PreviousSelectedSeries = this, IsSelected = false }; (ActualArea as SfChart).OnSelectionChanged(chartSelectionChangedEventArgs); PreviousSelectedIndex = newIndex; } } }
/// <summary> /// Method used to set SegmentSelectionBrush to SelectedIndex segment /// </summary> /// <param name="newIndex"></param> /// <param name="oldIndex"></param> protected internal override void SelectedIndexChanged(int newIndex, int oldIndex) { ChartSelectionChangedEventArgs chartSelectionChangedEventArgs; if (ActualArea != null && ActualArea.SelectionBehaviour != null) { // Resets the adornment selection when the mouse pointer moved away from the adornment or clicked the same adornment. if (ActualArea.SelectionBehaviour.SelectionStyle == SelectionStyle.Single) { if (SelectedSegmentsIndexes.Contains(oldIndex)) { SelectedSegmentsIndexes.Remove(oldIndex); } OnResetSegment(oldIndex); } if (newIndex >= 0 && ActualArea.GetEnableSegmentSelection()) { if (!SelectedSegmentsIndexes.Contains(newIndex)) { SelectedSegmentsIndexes.Add(newIndex); } // Selects the adornment when the mouse is over or clicked on adornments(adornment selection). if (adornmentInfo != null && adornmentInfo.HighlightOnSelection) { UpdateAdornmentSelection(newIndex); } if (ActualArea != null && Segments.Count > 0) { chartSelectionChangedEventArgs = new ChartSelectionChangedEventArgs() { SelectedSegment = Segments[0], SelectedSegments = Area.SelectedSegments, SelectedSeries = this, SelectedIndex = newIndex, PreviousSelectedIndex = oldIndex, NewPointInfo = GetDataPoint(newIndex), PreviousSelectedSeries = null, PreviousSelectedSegment = null, IsSelected = true }; chartSelectionChangedEventArgs.PreviousSelectedSeries = this.ActualArea.PreviousSelectedSeries; if (oldIndex != -1) { chartSelectionChangedEventArgs.PreviousSelectedSegment = Segments[0]; chartSelectionChangedEventArgs.OldPointInfo = GetDataPoint(oldIndex); } (ActualArea as SfChart).OnSelectionChanged(chartSelectionChangedEventArgs); PreviousSelectedIndex = newIndex; } else if (Segments.Count == 0) { triggerSelectionChangedEventOnLoad = true; } } else if (newIndex == -1 && ActualArea != null) { chartSelectionChangedEventArgs = new ChartSelectionChangedEventArgs() { SelectedSegment = null, SelectedSegments = Area.SelectedSegments, SelectedSeries = null, SelectedIndex = newIndex, PreviousSelectedIndex = oldIndex, PreviousSelectedSegment = null, PreviousSelectedSeries = this, IsSelected = false }; if (oldIndex != -1) { chartSelectionChangedEventArgs.PreviousSelectedSegment = Segments[0]; chartSelectionChangedEventArgs.OldPointInfo = GetDataPoint(oldIndex); } (ActualArea as SfChart).OnSelectionChanged(chartSelectionChangedEventArgs); PreviousSelectedIndex = newIndex; } } else if (newIndex >= 0 && Segments.Count == 0) { triggerSelectionChangedEventOnLoad = true; } }
internal override void SelectedSegmentsIndexes_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { ChartSelectionChangedEventArgs chartSelectionChangedEventArgs; switch (e.Action) { case NotifyCollectionChangedAction.Add: if (e.NewItems != null && !(ActualArea.SelectionBehaviour.SelectionStyle == SelectionStyle.Single)) { int oldIndex = PreviousSelectedIndex; int newIndex = (int)e.NewItems[0]; if (newIndex >= 0 && ActualArea.GetEnableSegmentSelection()) { // Selects the adornment when the mouse is over or clicked on adornments(adornment selection). if (adornmentInfo != null && adornmentInfo.HighlightOnSelection) { UpdateAdornmentSelection(newIndex); } if (ActualArea != null && Segments.Count > 0) { chartSelectionChangedEventArgs = new ChartSelectionChangedEventArgs() { SelectedSegment = Segments[0], SelectedSegments = Area.SelectedSegments, SelectedSeries = this, SelectedIndex = newIndex, PreviousSelectedIndex = oldIndex, NewPointInfo = GetDataPoint(newIndex), PreviousSelectedSeries = null, PreviousSelectedSegment = null, IsSelected = true }; chartSelectionChangedEventArgs.PreviousSelectedSeries = this.ActualArea.PreviousSelectedSeries; if (oldIndex != -1) { chartSelectionChangedEventArgs.PreviousSelectedSegment = Segments[0]; chartSelectionChangedEventArgs.OldPointInfo = GetDataPoint(oldIndex); } (ActualArea as SfChart).OnSelectionChanged(chartSelectionChangedEventArgs); PreviousSelectedIndex = newIndex; } else if (Segments.Count == 0) { triggerSelectionChangedEventOnLoad = true; } } } break; case NotifyCollectionChangedAction.Remove: if (e.OldItems != null && !(ActualArea.SelectionBehaviour.SelectionStyle == SelectionStyle.Single)) { int newIndex = (int)e.OldItems[0]; chartSelectionChangedEventArgs = new ChartSelectionChangedEventArgs() { SelectedSegment = null, SelectedSegments = Area.SelectedSegments, SelectedSeries = null, SelectedIndex = newIndex, PreviousSelectedIndex = PreviousSelectedIndex, PreviousSelectedSegment = null, PreviousSelectedSeries = this, IsSelected = false }; if (PreviousSelectedIndex != -1) { chartSelectionChangedEventArgs.PreviousSelectedSegment = Segments[0]; chartSelectionChangedEventArgs.OldPointInfo = GetDataPoint(PreviousSelectedIndex); } (ActualArea as SfChart).OnSelectionChanged(chartSelectionChangedEventArgs); OnResetSegment(newIndex); PreviousSelectedIndex = newIndex; } break; } }
protected override void OnPointerMoved(PointerRoutedEventArgs e) { if (ShowTooltip) { Canvas canvas = ActualArea.GetAdorningCanvas(); mousePos = e.GetCurrentPoint(canvas).Position; ChartDataPointInfo dataPoint = new ChartDataPointInfo(); int index = ChartExtensionUtils.GetAdornmentIndex(e.OriginalSource); if (index > -1) { if ((ActualXAxis is CategoryAxis) && (!(ActualXAxis as CategoryAxis).IsIndexed)) { if (GroupedSeriesYValues[0].Count > index) { dataPoint.High = GroupedSeriesYValues[0][index]; } if (GroupedSeriesYValues[1].Count > index) { dataPoint.Low = GroupedSeriesYValues[1][index]; } if (GroupedSeriesYValues[2].Count > index) { dataPoint.Open = GroupedSeriesYValues[2][index]; } if (GroupedSeriesYValues[3].Count > index) { dataPoint.Close = GroupedSeriesYValues[3][index]; } } else { if (ActualSeriesYValues[0].Count > index) { dataPoint.High = ActualSeriesYValues[0][index]; } if (ActualSeriesYValues[1].Count > index) { dataPoint.Low = ActualSeriesYValues[1][index]; } if (ActualSeriesYValues[2].Count > index) { dataPoint.Open = ActualSeriesYValues[2][index]; } if (ActualSeriesYValues[3].Count > index) { dataPoint.Close = ActualSeriesYValues[3][index]; } } dataPoint.Index = index; dataPoint.Series = this; if (ActualData.Count > index) { dataPoint.Item = ActualData[index]; } UpdateSeriesTooltip(dataPoint); } } }
/// <summary> /// Returns the value of side by side position for a series. /// </summary> /// <param name="currentseries">The ChartSeries.</param> /// <returns>The DoubleRange side by side Info</returns> internal DoubleRange GetZSideBySideInfo(ChartSeriesBase currentseries) { if (this.ActualArea != null) { if (this.ActualArea.InternalPrimaryAxis == null || this.ActualArea.InternalSecondaryAxis == null || this.ActualArea.InternalDepthAxis == null) { return(DoubleRange.Empty); } if (!this.ActualArea.SBSInfoCalculated || !this.ActualArea.SeriesPosition.ContainsKey(currentseries)) { this.CalculateSideBySidePositions(false); } double width = 1 - ChartSeriesBase.GetSpacing(this); double minWidth = 0d; int all = 0; // MinPointsDelta is assigned to field since whenever the value is get the MinPointsDelta is calculated. double minPointsDelta = (this.ActualArea as SfChart3D).ZMinPointsDelta; if (!double.IsNaN(minPointsDelta)) { minWidth = minPointsDelta; } var xyzDataSeries = currentseries as XyzDataSeries3D; int rowPos = currentseries.IsActualTransposed ? ActualArea.GetActualRow(xyzDataSeries.ActualZAxis) : ActualArea.GetActualRow(xyzDataSeries.ActualYAxis); int columnPos = currentseries.IsActualTransposed ? ActualArea.GetActualColumn(xyzDataSeries.ActualYAxis) : ActualArea.GetActualColumn(xyzDataSeries.ActualZAxis); var rowID = currentseries.ActualYAxis == null ? 0 : rowPos; var colID = xyzDataSeries.ActualZAxis == null ? 0 : columnPos; if ((rowID < this.ActualArea.SbsSeriesCount.GetLength(0)) && (colID < this.ActualArea.SbsSeriesCount.GetLength(1))) { all = this.ActualArea.SbsSeriesCount[rowID, colID]; } else { return(DoubleRange.Empty); } if (!this.ActualArea.SeriesPosition.ContainsKey(currentseries)) { return(DoubleRange.Empty); } int pos = this.ActualArea.SeriesPosition[currentseries]; if (all == 0) { all = 1; pos = 1; } double div = minWidth * width / all; double start = div * (pos - 1) - minWidth * width / 2; double end = start + div; // For adding additional space on both ends of side by side info series. this.CalculateSideBySideInfoPadding(minWidth, all, pos, false); return(new DoubleRange(start, end)); } else { return(DoubleRange.Empty); } }
/// <summary> /// Method used to set SegmentSelectionBrush to SelectedIndex segment /// </summary> /// <param name="newIndex"></param> /// <param name="oldIndex"></param> protected internal override void SelectedIndexChanged(int newIndex, int oldIndex) { ChartSelectionChangedEventArgs chartSelectionChangedEventArgs; if (ActualArea != null && ActualArea.SelectionBehaviour != null && !ActualArea.GetEnableSeriesSelection()) { // Reset the old segment if (ActualArea.SelectionBehaviour.SelectionStyle == SelectionStyle.Single) { if (SelectedSegmentsIndexes.Contains(oldIndex)) { SelectedSegmentsIndexes.Remove(oldIndex); } OnResetSegment(oldIndex); } if (newIndex >= 0 && ActualArea.GetEnableSegmentSelection()) { if (!SelectedSegmentsIndexes.Contains(newIndex)) { SelectedSegmentsIndexes.Add(newIndex); } dataPoint = GetDataPoint(newIndex); if (dataPoint != null && SegmentSelectionBrush != null) { // Selects the adornment when the mouse is over or clicked on adornments(adornment selection). if (adornmentInfo != null && adornmentInfo.HighlightOnSelection) { UpdateAdornmentSelection(newIndex); } // Generate pixels for the particular data point if (Segments.Count > 0) { if (Segments.Count > 0) { GeneratePixels(); } } // Set the SegmentSelectionBrush to the selected segment pixels OnBitmapSelection(selectedSegmentPixels, SegmentSelectionBrush, true); } // trigger the SelectionChanged event. if (ActualArea != null && Segments.Count > 0) { chartSelectionChangedEventArgs = new ChartSelectionChangedEventArgs() { SelectedSegment = Segments[0], SelectedSegments = Area.SelectedSegments, SelectedSeries = this, SelectedIndex = newIndex, PreviousSelectedIndex = oldIndex, NewPointInfo = GetDataPoint(newIndex), IsSelected = true }; chartSelectionChangedEventArgs.PreviousSelectedSeries = this.ActualArea.PreviousSelectedSeries; if (oldIndex != -1) { chartSelectionChangedEventArgs.PreviousSelectedSegment = Segments[0]; chartSelectionChangedEventArgs.OldPointInfo = GetDataPoint(oldIndex); } (ActualArea as SfChart).OnSelectionChanged(chartSelectionChangedEventArgs); PreviousSelectedIndex = newIndex; } else if (Segments.Count == 0) { triggerSelectionChangedEventOnLoad = true; } } else if (newIndex == -1 && ActualArea != null) { chartSelectionChangedEventArgs = new ChartSelectionChangedEventArgs() { SelectedSegment = null, SelectedSegments = Area.SelectedSegments, SelectedSeries = null, SelectedIndex = newIndex, PreviousSelectedIndex = oldIndex, PreviousSelectedSeries = this, PreviousSelectedSegment = null, IsSelected = false }; if (oldIndex != -1) { chartSelectionChangedEventArgs.PreviousSelectedSegment = GetDataPoint(oldIndex); chartSelectionChangedEventArgs.OldPointInfo = GetDataPoint(oldIndex); } (ActualArea as SfChart).OnSelectionChanged(chartSelectionChangedEventArgs); PreviousSelectedIndex = newIndex; } } else if (newIndex >= 0 && Segments.Count == 0) { triggerSelectionChangedEventOnLoad = true; } }
/// <summary> /// Finds the nearest point in ChartSeries relative to the mouse point/touch position. /// </summary> /// <param name="point">The co-ordinate point representing the current mouse point /touch position.</param> /// <param name="x">x-value of the nearest point.</param> /// <param name="y">y-value of the nearest point</param> /// <param name="stackedYValue"></param> public override void FindNearestChartPoint(Point point, out double x, out double y, out double stackedYValue) { x = double.NaN; y = 0d; stackedYValue = double.NaN; Point nearPoint = new Point(); if (this.IsIndexed || !(this.ActualXValues is IList <double>)) { if (ActualArea != null) { double xStart = ActualXAxis.VisibleRange.Start; double xEnd = ActualXAxis.VisibleRange.End; point = new Point(ActualArea.PointToValue(ActualXAxis, point), ActualArea.PointToValue(ActualYAxis, point)); double range = Math.Round(point.X); { var count = this.YCollection.Count; if (range <= xEnd && range >= xStart && range < count && range >= 0) { x = range; } } } } else { IList <double> xValues = this.ActualXValues as IList <double>; nearPoint.X = ActualXAxis.VisibleRange.Start; if (IsSideBySide) { DoubleRange sbsInfo = this.GetSideBySideInfo(this); nearPoint.X = ActualXAxis.VisibleRange.Start + sbsInfo.Start; } point = new Point(ActualArea.PointToValue(ActualXAxis, point), ActualArea.PointToValue(ActualYAxis, point)); for (int i = 0; i < DataCount; i++) { double x1 = xValues[i]; double y1 = 0d; if (this.ActualXAxis is LogarithmicAxis) { var logAxis = ActualXAxis as LogarithmicAxis; if (Math.Abs(point.X - x1) <= Math.Abs(point.X - nearPoint.X) && (Math.Log(point.X, logAxis.LogarithmicBase) > ActualXAxis.VisibleRange.Start && Math.Log(point.X, logAxis.LogarithmicBase) < ActualXAxis.VisibleRange.End)) { nearPoint = new Point(x1, y1); x = xValues[i]; } } else if (Math.Abs((point.X - x1)) <= Math.Abs((point.X - nearPoint.X)) && (point.X > ActualXAxis.VisibleRange.Start) && (point.X < ActualXAxis.VisibleRange.End)) { nearPoint = new Point(x1, y1); x = xValues[i]; } } } }
/// <summary> /// This method used to gets the chart data point at a position. /// </summary> /// <param name="mousePos"></param> /// <returns></returns> internal override ChartDataPointInfo GetDataPoint(Point mousePos) { bool isGrouped = ActualXAxis is CategoryAxis && !(ActualXAxis as CategoryAxis).IsIndexed; if (isGrouped) { xValues = GroupedXValuesIndexes; } else { xValues = (ActualXValues is IList <double>) ? ActualXValues as IList <double> : GetXValues(); } hitPoint.X = mousePos.X - this.Area.SeriesClipRect.Left; hitPoint.Y = mousePos.Y - this.Area.SeriesClipRect.Top; hitPoint.X = hitPoint.X - ScatterWidth; hitPoint.Y = hitPoint.Y - ScatterHeight; startPoint.X = ActualArea.PointToValue(ActualXAxis, hitPoint); startPoint.Y = ActualArea.PointToValue(ActualYAxis, hitPoint); hitPoint.X = hitPoint.X + (2 * ScatterWidth); hitPoint.Y = hitPoint.Y + (2 * ScatterHeight); endPoint.X = ActualArea.PointToValue(ActualXAxis, hitPoint); endPoint.Y = ActualArea.PointToValue(ActualYAxis, hitPoint); Rect rect = new Rect(startPoint, endPoint); dataPoint = null; for (int i = 0; i < YValues.Count; i++) { if (isGrouped) { if (i < xValues.Count) { hitPoint.X = xValues[i]; hitPoint.Y = GroupedSeriesYValues[0][i]; } else { return(dataPoint); } } else { hitPoint.X = IsIndexed ? i : xValues[i]; hitPoint.Y = YValues[i]; } if (rect.Contains(hitPoint)) { dataPoint = new ChartDataPointInfo(); dataPoint.Index = i; dataPoint.XData = xValues[i]; dataPoint.YData = (isGrouped) ? GroupedSeriesYValues[0][i] : YValues[i]; dataPoint.Series = this; if (i > -1 && ActualData.Count > i) { dataPoint.Item = ActualData[i]; } break; } } return(dataPoint); }
internal override void SelectedSegmentsIndexes_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { ChartSelectionChangedEventArgs chartSelectionChangedEventArgs; switch (e.Action) { case NotifyCollectionChangedAction.Add: if (e.NewItems != null && ActualArea.SelectionBehaviour.SelectionStyle != SelectionStyle.Single) { int oldIndex = PreviousSelectedIndex; int newIndex = (int)e.NewItems[0]; // For adornment selection implementation if (newIndex >= 0 && ActualArea.GetEnableSegmentSelection()) { dataPoint = GetDataPoint(newIndex); if (dataPoint != null && SegmentSelectionBrush != null) { // Selects the adornment when the mouse is over or clicked on adornments(adornment selection). if (adornmentInfo != null && adornmentInfo.HighlightOnSelection) { UpdateAdornmentSelection(newIndex); } // Generate pixels for the particular data point if (Segments.Count > 0) { GeneratePixels(); } // Set the SegmentSelectionBrush to the selected segment pixels OnBitmapSelection(selectedSegmentPixels, SegmentSelectionBrush, true); } // trigger the SelectionChanged event if (ActualArea != null && Segments.Count > 0) { chartSelectionChangedEventArgs = new ChartSelectionChangedEventArgs() { SelectedSegment = Segments[0], SelectedSegments = Area.SelectedSegments, SelectedSeries = this, SelectedIndex = newIndex, PreviousSelectedIndex = oldIndex, NewPointInfo = GetDataPoint(newIndex), IsSelected = true }; chartSelectionChangedEventArgs.PreviousSelectedSeries = this.ActualArea.PreviousSelectedSeries; if (oldIndex != -1) { chartSelectionChangedEventArgs.PreviousSelectedSegment = Segments[0]; chartSelectionChangedEventArgs.OldPointInfo = GetDataPoint(oldIndex); } (ActualArea as SfChart).OnSelectionChanged(chartSelectionChangedEventArgs); PreviousSelectedIndex = newIndex; } else if (Segments.Count == 0) { triggerSelectionChangedEventOnLoad = true; } } } break; case NotifyCollectionChangedAction.Remove: if (e.OldItems != null && ActualArea.SelectionBehaviour.SelectionStyle != SelectionStyle.Single) { int newIndex = (int)e.OldItems[0]; chartSelectionChangedEventArgs = new ChartSelectionChangedEventArgs() { SelectedSegment = null, SelectedSegments = Area.SelectedSegments, SelectedSeries = null, SelectedIndex = newIndex, PreviousSelectedIndex = PreviousSelectedIndex, PreviousSelectedSegment = null, PreviousSelectedSeries = this, IsSelected = false }; if (PreviousSelectedIndex != -1) { chartSelectionChangedEventArgs.PreviousSelectedSegment = Segments[0]; chartSelectionChangedEventArgs.OldPointInfo = GetDataPoint(PreviousSelectedIndex); } (ActualArea as SfChart).OnSelectionChanged(chartSelectionChangedEventArgs); OnResetSegment(newIndex); PreviousSelectedIndex = newIndex; } break; } }
internal override void SelectedSegmentsIndexes_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { ChartSelectionChangedEventArgs chartSelectionChangedEventArgs; ChartSegment prevSelectedSegment = null; if (prevDataPoint != null && Segments.Count > 0) { prevSelectedSegment = (from segment in Segments where segment is FastLineSegment && (segment as FastLineSegment).xChartVals.Contains(prevDataPoint.XData) select segment).FirstOrDefault() as ChartSegment; } switch (e.Action) { case NotifyCollectionChangedAction.Add: if (e.NewItems != null && !(ActualArea.SelectionBehaviour.SelectionStyle == SelectionStyle.Single)) { int oldIndex = PreviousSelectedIndex; int newIndex = (int)e.NewItems[0]; // For adornment selection implementation if (newIndex >= 0 && ActualArea.GetEnableSegmentSelection()) { // Selects the adornment when the mouse is over or clicked on adornments(adornment selection). if (adornmentInfo != null && adornmentInfo.HighlightOnSelection) { UpdateAdornmentSelection(newIndex); } if (ActualArea != null && Segments.Count > 0) { var selectedSegment = (from segment in Segments where segment is FastLineSegment && (segment as FastLineSegment).xChartVals.Contains(dataPoint.XData) select segment).FirstOrDefault(); if (selectedSegment != null) { chartSelectionChangedEventArgs = new ChartSelectionChangedEventArgs() { SelectedSegment = selectedSegment, SelectedSegments = Area.SelectedSegments, SelectedSeries = this, SelectedIndex = newIndex, PreviousSelectedIndex = oldIndex, NewPointInfo = GetDataPoint(newIndex), IsSelected = true }; chartSelectionChangedEventArgs.PreviousSelectedSeries = this.ActualArea.PreviousSelectedSeries; if (oldIndex != -1) { chartSelectionChangedEventArgs.PreviousSelectedSegment = prevSelectedSegment; chartSelectionChangedEventArgs.OldPointInfo = GetDataPoint(oldIndex); } (ActualArea as SfChart).OnSelectionChanged(chartSelectionChangedEventArgs); PreviousSelectedIndex = newIndex; prevDataPoint = dataPoint; } } else if (Segments.Count == 0) { triggerSelectionChangedEventOnLoad = true; } } } break; case NotifyCollectionChangedAction.Remove: if (e.OldItems != null && !(ActualArea.SelectionBehaviour.SelectionStyle == SelectionStyle.Single)) { int newIndex = (int)e.OldItems[0]; chartSelectionChangedEventArgs = new ChartSelectionChangedEventArgs() { SelectedSegment = null, SelectedSegments = Area.SelectedSegments, SelectedSeries = null, SelectedIndex = newIndex, PreviousSelectedIndex = PreviousSelectedIndex, NewPointInfo = null, OldPointInfo = GetDataPoint(PreviousSelectedIndex), PreviousSelectedSeries = this, IsSelected = false }; if (PreviousSelectedIndex != -1) { chartSelectionChangedEventArgs.PreviousSelectedSegment = prevSelectedSegment; } (ActualArea as SfChart).OnSelectionChanged(chartSelectionChangedEventArgs); OnResetSegment(newIndex); PreviousSelectedIndex = newIndex; } break; } }