예제 #1
0
        private int GetSegmentMousePosition(RangeColumnSegment rangeColumnSegment, Point mousePos)
        {
            var high             = rangeColumnSegment.High;
            var low              = rangeColumnSegment.Low;
            var currentValue     = Area.PointToValue(ActualYAxis, mousePos);
            var diffPercentValue = (Math.Abs(high - low) * 25 / 100);

            if (low < high)
            {
                var finalHigh = high - diffPercentValue;
                var finalLow  = low + diffPercentValue;

                if (currentValue > finalHigh && high > currentValue)
                {
                    return(1);
                }
                if (currentValue < finalLow && currentValue > low)
                {
                    return(2);
                }
                return(3);
            }
            else
            {
                var finalHigh = high + diffPercentValue;
                var finalLow  = low - diffPercentValue;

                if (currentValue < finalHigh && high < currentValue)
                {
                    return(1);
                }
                if (currentValue > finalLow && currentValue < low)
                {
                    return(2);
                }
                return(3);
            }
        }
예제 #2
0
        private void ActivateDragging(Point mousePos, object element)
        {
            try
            {
                if (previewRect != null)
                {
                    return;
                }
                var rectangle = element as Rectangle;
                if (rectangle == null || !EnableSegmentDragging)
                {
                    return;
                }
                var rangeColumnSegment = rectangle.Tag as RangeColumnSegment;
                if (rangeColumnSegment == null)
                {
                    return;
                }
                initialHeight = Canvas.GetTop(rectangle);
                var brush = rectangle.Fill as SolidColorBrush;
                previewRect = new Rectangle
                {
                    Fill = brush != null
                    ? new SolidColorBrush(
                        Color.FromArgb(
                            brush.Color.A,
                            (byte)(brush.Color.R * 0.6),
                            (byte)(brush.Color.G * 0.6),
                            (byte)(brush.Color.B * 0.6)))
                            : rectangle.Fill,
                    Opacity         = 0.5,
                    Stroke          = rectangle.Stroke,
                    StrokeThickness = rectangle.StrokeThickness
                };
                previewRect.SetValue(Canvas.LeftProperty, Canvas.GetLeft(rectangle));
                previewRect.SetValue(Canvas.TopProperty, initialHeight);
                previewRect.Height = rectangle.ActualHeight;
                previewRect.Width  = rectangle.ActualWidth;
                SeriesPanel.Children.Add(previewRect);
                SegmentIndex    = Segments.IndexOf(rectangle.Tag as ChartSegment);
                draggingMode    = GetSegmentMousePosition(rangeColumnSegment, mousePos);
                selectedSegment = rangeColumnSegment;
                initialHeight   = IsActualTransposed ? mousePos.X : mousePos.Y;
                initialValue    = Area.PointToValue(ActualYAxis, mousePos);
                var dragEventArgs = new ChartDragStartEventArgs
                {
                    BaseXValue = GetActualXValue(SegmentIndex)
                };
                RaiseDragStart(dragEventArgs);
                if (dragEventArgs.Cancel)
                {
                    ResetDraggingElements("Cancel", true);
                }
#if NETFX_CORE
                Focus(FocusState.Keyboard);
#endif
                UnHoldPanning(false);
            }
            catch
            {
                ResetDraggingElements("Exception", true);
            }
        }
예제 #3
0
        /// <summary>
        /// Creates the segments of RangeColumn Series.
        /// </summary>
        public override void CreateSegments()
        {
            double        x1, x2, y1, y2;
            List <double> xValues    = null;
            bool          isGrouping = this.ActualXAxis is CategoryAxis && !(this.ActualXAxis as CategoryAxis).IsIndexed;

            if (isGrouping)
            {
                xValues = GroupedXValuesIndexes;
            }
            else
            {
                xValues = GetXValues();
            }

            if (xValues != null)
            {
                DoubleRange sbsInfo = this.GetSideBySideInfo(this);
                if (isGrouping)
                {
                    Segments.Clear();
                    Adornments.Clear();
                    for (int i = 0; i < this.DataCount; i++)
                    {
                        if (i < xValues.Count && GroupedSeriesYValues[0].Count > i)
                        {
                            x1 = xValues[i] + sbsInfo.Start;
                            x2 = xValues[i] + sbsInfo.End;
                            y1 = GroupedSeriesYValues[0][i];
                            y2 = IsMultipleYPathRequired ? GroupedSeriesYValues[1][i] : 0;
                            RangeColumnSegment rangeColumn = new RangeColumnSegment(x1, y1, x2, y2, this, ActualData[i]);
                            rangeColumn.High = GroupedSeriesYValues[0][i];
                            rangeColumn.Low  = IsMultipleYPathRequired ? GroupedSeriesYValues[1][i] : 0;
                            Segments.Add(rangeColumn);
                            if (AdornmentsInfo != null)
                            {
                                AddAdornments(xValues[i], sbsInfo.Start + sbsInfo.Delta / 2, y1, y2, i);
                            }
                        }
                    }
                }
                else
                {
                    if (Segments.Count > this.DataCount)
                    {
                        ClearUnUsedSegments(this.DataCount);
                    }

                    if (AdornmentsInfo != null)
                    {
                        if (AdornmentsInfo.AdornmentsPosition == AdornmentsPosition.TopAndBottom)
                        {
                            ClearUnUsedAdornments(this.DataCount * 2);
                        }
                        else
                        {
                            ClearUnUsedAdornments(this.DataCount);
                        }
                    }

                    for (int i = 0; i < this.DataCount; i++)
                    {
                        x1 = xValues[i] + sbsInfo.Start;
                        x2 = xValues[i] + sbsInfo.End;
                        y1 = HighValues[i];
                        y2 = IsMultipleYPathRequired ? LowValues[i] : 0;

                        if (i < Segments.Count)
                        {
                            (Segments[i].Item) = ActualData[i];
                            (Segments[i]).SetData(x1, y1, x2, y2);
                            (Segments[i] as RangeColumnSegment).High = y1;
                            (Segments[i] as RangeColumnSegment).Low  = y2;
                            if (SegmentColorPath != null && !Segments[i].IsEmptySegmentInterior && ColorValues.Count > 0 && !Segments[i].IsSelectedSegment)
                            {
                                Segments[i].Interior = (Interior != null) ? Interior : ColorValues[i];
                            }
                        }
                        else
                        {
                            RangeColumnSegment rangeColumn = new RangeColumnSegment(x1, y1, x2, y2, this, ActualData[i]);
                            rangeColumn.High = y1;
                            rangeColumn.Low  = y2;
                            Segments.Add(rangeColumn);
                        }

                        if (AdornmentsInfo != null)
                        {
                            AddAdornments(xValues[i], sbsInfo.Start + sbsInfo.Delta / 2, y1, y2, i);
                        }
                    }
                }

                if (ShowEmptyPoints)
                {
                    UpdateEmptyPointSegments(xValues, true);
                }
            }
        }