Пример #1
0
        /// <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);
                }
            }
        }
Пример #4
0
 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);
     }
 }
Пример #5
0
        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);
        }
Пример #6
0
        /// <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));
                }
            }
        }
Пример #7
0
        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];
        }
Пример #8
0
        /// <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;
            }
        }
Пример #11
0
        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);
                }
            }
        }
Пример #12
0
        /// <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);
            }
        }
Пример #13
0
        /// <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;
            }
        }
Пример #14
0
        /// <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];
                    }
                }
            }
        }
Пример #15
0
        /// <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);
        }
Пример #16
0
        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;
            }
        }
Пример #17
0
        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;
            }
        }