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); } }
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); } }
/// <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); } } }