protected internal override void OnPointerMoved(PointerRoutedEventArgs e) { if (ChartArea == null) { return; } if (this.EnableSegmentSelection || this.EnableSeriesSelection) { FrameworkElement element = e.OriginalSource as FrameworkElement; ChartSegment segment = null; if (element != null) { if (element.Tag != null) { segment = element.Tag as ChartSegment; } } if (segment is TrendlineSegment) { return; } if (element.DataContext is LegendItem) { return; } #if __IOS__ || __ANDROID__ var image = (element as Border)?.Child as Image; #else var image = element as Image; #endif if (segment != null && segment.Series is ISegmentSelectable && !(segment.Item is Trendline)) { // Scatter series supports selection and dragging at the same time. if (!(segment.Series is ScatterSeries) && IsDraggableSeries(segment.Series)) { return; } if (!segment.Series.IsLinear || EnableSeriesSelection) { ChangeSelectionCursor(true); } else { ChangeSelectionCursor(false); } if (SelectionMode == Charts.SelectionMode.MouseMove) { if (!segment.Series.IsSideBySide && segment.Series is CartesianSeries && !(segment.Series is ScatterSeries) && !(segment.Series is BubbleSeries)) { Point canvasPoint = e.GetCurrentPoint(segment.Series.ActualArea.GetAdorningCanvas()).Position; ChartDataPointInfo data = (segment.Series as ChartSeries).GetDataPoint(canvasPoint); OnMouseMoveSelection(segment.Series, data); } else { int segIndex = segment.Series is CircularSeriesBase && !double.IsNaN(((CircularSeriesBase)segment.Series).GroupTo) ?segment.Series.Segments.IndexOf(segment): segment.Series.ActualData.IndexOf(segment.Item); OnMouseMoveSelection(segment.Series, segIndex); } } } else if (e.OriginalSource is Shape && (e.OriginalSource as Shape).DataContext is ChartAdornmentContainer && ((e.OriginalSource as Shape).DataContext as ChartAdornmentContainer).Tag is int) { // Check the selected element is adornment shape selectedAdornmentPresenter = VisualTreeHelper.GetParent((e.OriginalSource as Shape).DataContext as ChartAdornmentContainer) as ChartAdornmentPresenter; if (IsDraggableSeries(selectedAdornmentPresenter.Series)) { return; } ChangeSelectionCursor(true); if (SelectionMode == Charts.SelectionMode.MouseMove) { index = (int)((e.OriginalSource as Shape).DataContext as ChartAdornmentContainer).Tag; if (selectedAdornmentPresenter != null && selectedAdornmentPresenter.Series is ISegmentSelectable) { OnMouseMoveSelection(selectedAdornmentPresenter.Series, index); } } } else if (image != null && image.Source is WriteableBitmap) { GetBitmapSeriesCollection(element, e); // Bitmap segment selection process handling. if (SelectionMode == Charts.SelectionMode.MouseMove) { OnBitmapSeriesMouseMoveSelection(element, e); } } else if (element is Border || element is TextBlock || element is Shape) // check the selected element is adornment label { ChangeSelectionCursor(false); FrameworkElement frameworkElement = e.OriginalSource as FrameworkElement; int count = e.OriginalSource is TextBlock ? 3 : 2; for (int i = 0; i < count; i++) { if (frameworkElement != null) { frameworkElement = VisualTreeHelper.GetParent(frameworkElement) as FrameworkElement; } else { break; } } if (frameworkElement is ContentPresenter) { index = ChartExtensionUtils.GetAdornmentIndex(frameworkElement); if (index != -1) { ChangeSelectionCursor(true); } if (SelectionMode == Charts.SelectionMode.MouseMove) { frameworkElement = VisualTreeHelper.GetParent(frameworkElement) as FrameworkElement; if (frameworkElement is ChartAdornmentPresenter || frameworkElement is ChartAdornmentContainer) { while (!(frameworkElement is ChartAdornmentPresenter) && frameworkElement != null) { frameworkElement = VisualTreeHelper.GetParent(frameworkElement) as FrameworkElement; } selectedAdornmentPresenter = frameworkElement as ChartAdornmentPresenter; if (IsDraggableSeries(selectedAdornmentPresenter.Series)) { return; } if (selectedAdornmentPresenter != null && selectedAdornmentPresenter.Series is ISegmentSelectable) { OnMouseMoveSelection(selectedAdornmentPresenter.Series, index); } } } } var contentControl = frameworkElement as ContentControl; if (contentControl != null && contentControl.Tag is int) { ChangeSelectionCursor(true); if (SelectionMode == Charts.SelectionMode.MouseMove) { index = (int)contentControl.Tag; frameworkElement = VisualTreeHelper.GetParent(frameworkElement) as FrameworkElement; var chartAdornmentPresenter = frameworkElement as ChartAdornmentPresenter; if (chartAdornmentPresenter != null) { selectedAdornmentPresenter = chartAdornmentPresenter; if (IsDraggableSeries(selectedAdornmentPresenter.Series)) { return; } if (selectedAdornmentPresenter != null && selectedAdornmentPresenter.Series is ISegmentSelectable) { OnMouseMoveSelection(selectedAdornmentPresenter.Series, index); } } } } } else if (ChartArea.PreviousSelectedSeries != null && ChartArea.CurrentSelectedSeries != null && SelectionMode == Charts.SelectionMode.MouseMove && ChartArea.VisibleSeries.Contains(ChartArea.PreviousSelectedSeries)) { ChangeSelectionCursor(false); bool isCancel; if (EnableSeriesSelection) { isCancel = ChartArea.CurrentSelectedSeries.RaiseSelectionChanging(-1, ChartArea.SeriesSelectedIndex); } else { isCancel = ChartArea.CurrentSelectedSeries.RaiseSelectionChanging( -1, (ChartArea.CurrentSelectedSeries as ISegmentSelectable).SelectedIndex); } if (!isCancel) { Deselect(); } } else { ChangeSelectionCursor(false); } } else { ChangeSelectionCursor(false); } }
/// <summary> /// Called when Pointer Released in Chart /// </summary> /// <param name="e"></param> protected internal override void OnPointerReleased(PointerRoutedEventArgs e) { if (ChartArea == null) { return; } if (SelectionMode == Charts.SelectionMode.MouseClick) { FrameworkElement element = e.OriginalSource as FrameworkElement; ChartSegment segment = null; ChartArea.CurrentSelectedSeries = null; if (element != null) { if (element.Tag != null) { segment = element.Tag as ChartSegment; } } if (segment is TrendlineSegment) { return; } #if __IOS__ || __ANDROID__ var image = (element as Border)?.Child as Image; #else var image = element as Image; #endif if (image != null && image.Source is WriteableBitmap) { // Bitmap segment selection process handling. OnBitmapSeriesMouseDownSelection(element, e); } else if (segment != null && segment == mouseUnderSegment && segment.Series is ISegmentSelectable && !(segment.Item is Trendline)) { if (!segment.Series.IsSideBySide && segment.Series is CartesianSeries && !(segment.Series is ScatterSeries) && !(segment.Series is BubbleSeries)) { Point canvasPoint = e.GetCurrentPoint(segment.Series.ActualArea.GetAdorningCanvas()).Position; ChartDataPointInfo data = (segment.Series as ChartSeries).GetDataPoint(canvasPoint); OnMouseDownSelection(segment.Series, data); } else { int index = -1; if ((segment.Series.ActualXAxis is CategoryAxis) && !(segment.Series.ActualXAxis as CategoryAxis).IsIndexed && segment.Series.IsSideBySide && !(segment.Series is FinancialSeriesBase) && (!(segment.Series is RangeSeriesBase)) && !(segment.Series is WaterfallSeries)) { index = segment.Series.GroupedActualData.IndexOf(segment.Item); } else { index = segment.Series is CircularSeriesBase && !double.IsNaN(((CircularSeriesBase)segment.Series).GroupTo)? segment.Series.Segments.IndexOf(segment): segment.Series.ActualData.IndexOf(segment.Item); } OnMouseDownSelection(segment.Series, index); } } else { // Get the selected adornment index and select the adornment marker index = ChartExtensionUtils.GetAdornmentIndex(element); FrameworkElement frameworkElement = e.OriginalSource as FrameworkElement; var chartAdornmentPresenter = frameworkElement as ChartAdornmentPresenter; while (frameworkElement != null && chartAdornmentPresenter == null) { frameworkElement = VisualTreeHelper.GetParent(frameworkElement) as FrameworkElement; chartAdornmentPresenter = frameworkElement as ChartAdornmentPresenter; } if (chartAdornmentPresenter != null && chartAdornmentPresenter.Series is ISegmentSelectable) { OnMouseDownSelection(chartAdornmentPresenter.Series, index); } } if (selectedAdornmentPresenter != null) { selectedAdornmentPresenter = null; } } AdorningCanvas.ReleasePointerCapture(e.Pointer); }