/// <summary> /// Calculates the visible range. /// </summary> /// <param name="axis">The axis.</param> /// <param name="avalableSize">Size of the available.</param> /// <param name="interval">The interval.</param> internal static void CalculateVisibleRange(ChartAxisBase2D axis, Size avalableSize, object interval) { if (axis.ZoomFactor < 1 || axis.ZoomPosition > 0) { #if NETFX_CORE if (interval == null || Convert.ToDouble(interval) == 0) #else if (interval == null || ((double?)interval).Value == 0) #endif { axis.VisibleInterval = axis.CalculateNiceInterval(axis.VisibleRange, avalableSize); } else if (interval != null) { #if NETFX_CORE double actualInterval = Convert.ToDouble(interval); #else double actualInterval = ((double?)interval).Value; #endif axis.VisibleInterval = axis.EnableAutoIntervalOnZooming ? axis.CalculateNiceInterval(axis.VisibleRange, avalableSize) : actualInterval; } } }
// To set the properties of corresponding textblock and border internal void SetVisualBinding(TextBlock textBlock, Border border, ChartAxisBase2D axis) { Binding binding = new Binding() { Source = this, Path = new PropertyPath("FontSize") }; textBlock.SetBinding(TextBlock.FontSizeProperty, binding); binding = new Binding() { Source = this, Path = new PropertyPath("Text") }; textBlock.SetBinding(TextBlock.TextProperty, binding); binding = new Binding() { Source = this, Path = new PropertyPath("Foreground") }; textBlock.SetBinding(TextBlock.ForegroundProperty, binding); binding = new Binding() { Source = this, Path = new PropertyPath("FontFamily") }; textBlock.SetBinding(TextBlock.FontFamilyProperty, binding); textBlock.Tag = this; binding = new Binding() { Source = axis, Path = new PropertyPath("LabelBorderBrush") }; border.SetBinding(Border.BorderBrushProperty, binding); }
/// <summary> /// Calculates the visible range. /// </summary> /// <param name="axis">The axis.</param> /// <param name="availableSize">Size of the available.</param> /// <param name="interval">The interval.</param> internal static void CalculateVisibleRange(ChartAxisBase2D axis, Size availableSize, double interval) { if (axis.ZoomFactor < 1 || axis.ZoomPosition > 0) { if (interval != 0 || !double.IsNaN(interval)) { axis.VisibleInterval = axis.EnableAutoIntervalOnZooming ? axis.CalculateNiceInterval(axis.VisibleRange, availableSize) : axis.ActualInterval; } else { axis.VisibleInterval = axis.CalculateNiceInterval(axis.VisibleRange, availableSize); } } else { var dateTimeAxis = axis as DateTimeAxis; if (dateTimeAxis.IntervalType != DateTimeIntervalType.Auto) { dateTimeAxis.ActualIntervalType = dateTimeAxis.IntervalType; } if (interval != 0 || !double.IsNaN(interval)) { axis.VisibleInterval = axis.ActualInterval; } else { axis.VisibleInterval = axis.CalculateNiceInterval(axis.VisibleRange, availableSize); } } }
internal void Dispose() { Axis = null; if (labelsPanel != null) { labelsPanel.Children.Clear(); } }
/// <summary> /// Generates the visible labels. /// </summary> /// <param name="axis">The axis.</param> internal static void GenerateVisibleLabels(ChartAxisBase2D axis, object minimum, object maximum, object actualInterval) { double interval = axis.VisibleInterval; var range = axis.VisibleRange; double position; var timeSpanAxis = axis as TimeSpanAxis; if ((minimum != null && maximum != null && actualInterval != null) || axis.EdgeLabelsVisibilityMode == EdgeLabelsVisibilityMode.AlwaysVisible || (axis.EdgeLabelsVisibilityMode == EdgeLabelsVisibilityMode.Visible && !axis.IsZoomed)) { position = range.Start; } else { position = range.Start - (range.Start % interval); } double previousPosition = double.NaN; for (; position <= axis.VisibleRange.End; position += interval) { if (position == previousPosition) { break; } if (axis.VisibleRange.Inside(position)) { axis.VisibleLabels.Add(new ChartAxisLabel(position, timeSpanAxis.GetActualLabelContent(position), position)); } if (axis.smallTicksRequired) { axis.AddSmallTicksPoint(position); } previousPosition = position; } #if NETFX_CORE if (((maximum != null && range.End.Equals((TimeSpan.Parse(maximum.ToString())).TotalMilliseconds)) || axis.EdgeLabelsVisibilityMode == EdgeLabelsVisibilityMode.AlwaysVisible || (axis.EdgeLabelsVisibilityMode == EdgeLabelsVisibilityMode.Visible && !axis.IsZoomed)) && !range.End.Equals(position - interval)) #else if (((maximum != null && range.End.Equals(((TimeSpan)maximum).TotalMilliseconds)) || axis.EdgeLabelsVisibilityMode == EdgeLabelsVisibilityMode.AlwaysVisible || (axis.EdgeLabelsVisibilityMode == EdgeLabelsVisibilityMode.Visible && !axis.IsZoomed)) && !range.End.Equals(position - interval)) #endif { axis.VisibleLabels.Add(new ChartAxisLabel(range.End, timeSpanAxis.GetActualLabelContent(range.End), range.End)); } }
/// <summary> /// Calculates the visible range. /// </summary> /// <param name="axis">The axis.</param> /// <param name="avalableSize">Size of the available.</param> /// <param name="interval">The interval.</param> internal static void CalculateVisibleRange(ChartAxisBase2D axis, Size avalableSize, object interval) { if (axis.ZoomFactor < 1 || axis.ZoomPosition > 0) { if (interval != null) { axis.VisibleInterval = axis.EnableAutoIntervalOnZooming ? axis.CalculateNiceInterval(axis.VisibleRange, avalableSize) : axis.ActualInterval; } else { axis.VisibleInterval = axis.CalculateNiceInterval(axis.VisibleRange, avalableSize); } } }
/// <summary> /// Method implementation for Generate Labels in ChartAxis /// </summary> /// <param name="axis">The axis.</param> /// <param name="smallTicksPerInterval">The small ticks per interval.</param> internal static void GenerateVisibleLabels(ChartAxisBase2D axis, object minimum, object maximum, object actualInterval, double smallTicksPerInterval) { DoubleRange range = axis.VisibleRange; double interval = axis.VisibleInterval; double position; if ((minimum != null && maximum != null && actualInterval != null) || axis.DesiredIntervalsCount != null || axis.EdgeLabelsVisibilityMode == EdgeLabelsVisibilityMode.AlwaysVisible || (axis.EdgeLabelsVisibilityMode == EdgeLabelsVisibilityMode.Visible && !axis.IsZoomed)) { position = range.Start; } else { position = range.Start - (range.Start % interval); } double previousPosition = double.NaN; for (; position <= range.End; position += interval) { if (position == previousPosition) { break; } if (range.Inside(position)) { axis.VisibleLabels.Add(new ChartAxisLabel(position, (axis as ChartAxis).GetActualLabelContent(position), position)); } if (axis.smallTicksRequired) { axis.AddSmallTicksPoint(position); } previousPosition = position; } if (((maximum != null && range.End.Equals(maximum)) || axis.EdgeLabelsVisibilityMode == EdgeLabelsVisibilityMode.AlwaysVisible || (axis.EdgeLabelsVisibilityMode == EdgeLabelsVisibilityMode.Visible && !axis.IsZoomed)) && !range.End.Equals(position - interval)) { axis.VisibleLabels.Add(new ChartAxisLabel(range.End, (axis as ChartAxis).GetActualLabelContent(range.End), range.End)); } }
internal void Dispose() { DetachTouchModeEvents(); #if NETFX_CORE if (handler != null) { if (parent is Page) { (parent as Page).RemoveHandler(Page.PointerPressedEvent, handler); } } #endif DiposeEvents(); axis = null; }
/// <summary> /// Method implementation for Generate Labels in ChartAxis /// </summary> /// <param name="axis">The axis.</param> /// <param name="maximum">The maximum.</param> /// <param name="minimum">The minimum.</param> /// <param name="actualInterval">The actual interval.</param> internal static void GenerateVisibleLabels(ChartAxisBase2D axis, object minimum, object maximum, object actualInterval, double logBase) { double interval = axis.VisibleInterval; var logarithmicAxis = axis as LogarithmicAxis; double position; if ((minimum != null && maximum != null && actualInterval != null) || axis.EdgeLabelsVisibilityMode == EdgeLabelsVisibilityMode.AlwaysVisible || (axis.EdgeLabelsVisibilityMode == EdgeLabelsVisibilityMode.Visible && !axis.IsZoomed)) { position = axis.VisibleRange.Start; } else { position = axis.VisibleRange.Start - (axis.VisibleRange.Start % axis.ActualInterval); } for (; position <= axis.VisibleRange.End; position += interval) { if (axis.VisibleRange.Inside(position)) { axis.VisibleLabels.Add(new ChartAxisLabel(position, logarithmicAxis.GetActualLabelContent(Math.Pow(logBase, position)), position)); } if (axis.smallTicksRequired) { axis.AddSmallTicksPoint(position, logarithmicAxis.LogarithmicBase); } } if (((maximum != null && axis.VisibleRange.End.Equals(maximum)) || axis.EdgeLabelsVisibilityMode == EdgeLabelsVisibilityMode.AlwaysVisible || (axis.EdgeLabelsVisibilityMode == EdgeLabelsVisibilityMode.Visible && !axis.IsZoomed)) && !axis.VisibleRange.End.Equals(position - interval)) { axis.VisibleLabels.Add(new ChartAxisLabel(axis.VisibleRange.End, logarithmicAxis.GetActualLabelContent(Math.Pow(logBase, axis.VisibleRange.End)), axis.VisibleRange.End)); } }
/// <summary> /// Updates the vertical stripline. /// </summary> /// <param name="axis">The Axis</param> private void UpdateVerticalStripLine(ChartAxisBase2D axis) { var visibleRange = axis.VisibleRange; var seriesRect = Area.SeriesClipRect; axis.StriplineXRange = DoubleRange.Empty; axis.StriplineYRange = DoubleRange.Empty; foreach (var stripLine in axis.StripLines) { IEnumerable <ChartAxis> xAxes; ChartAxis cusAxis = Area.Axes[stripLine.SegmentAxisName]; if (cusAxis != null) { xAxes = new List <ChartAxis> { cusAxis }; } else if (axis.RegisteredSeries.Count > 0) { xAxes = (Area.ColumnDefinitions.Count > 1) ? axis.AssociatedAxes : axis.AssociatedAxes.DistinctBy(Area.GetActualColumn);//WPF-13976-StripLine not working while using RowDefinitions } else { xAxes = new List <ChartAxis> { Area.InternalPrimaryAxis }; } foreach (var xAxis in xAxes) { var count = axis.RegisteredSeries.Where(item => item.ActualXAxis == xAxis || item.ActualYAxis == xAxis).Count();//stripline drawn for all the xaxis in the chart area .hence it is filtered using its associated axis- WPF-13976 if (count == 0 && axis.RegisteredSeries.Count == 0) { count = 1; } if (count > 0) { var xAxisRect = xAxis.ArrangeRect; var yAxisRect = axis.ArrangeRect; Rect stripRect; if (!stripLine.IsSegmented) { double startStrip = stripLine.Start; double endStrip = double.IsNaN(stripLine.RepeatUntil) ? visibleRange.End : stripLine.RepeatUntil; double periodStrip = stripLine.RepeatEvery; do { double y1 = Area.ValueToPoint(axis, startStrip); double y2; if (stripLine.IsPixelWidth) { y2 = stripLine.Width < yAxisRect.Height ? y1 - stripLine.Width : y1 - yAxisRect.Height; } else { double stripEnd = (!double.IsNaN(stripLine.RepeatUntil) ? (startStrip < stripLine.RepeatUntil) ? startStrip + stripLine.Width : startStrip - stripLine.Width : startStrip + stripLine.Width); y2 = Area.ValueToPoint(axis, stripEnd); } axis.StriplineYRange += new DoubleRange(startStrip, Area.PointToValue(axis, new Point(0, y2))); double top = yAxisRect.Top - seriesRect.Top; y2 = y2 > top ? y2 : top; stripRect = new Rect(new Point(xAxisRect.Left - seriesRect.Left, y1), new Point(xAxisRect.Width + xAxisRect.Left - seriesRect.Left, y2)); RenderStripLine(stripRect, stripLine); startStrip = startStrip < endStrip ? startStrip + periodStrip : startStrip - periodStrip; }while (periodStrip != 0 && (Double.IsNaN(stripLine.RepeatUntil) ? startStrip < endStrip : (stripLine.Start < stripLine.RepeatUntil ? startStrip <endStrip : startStrip> endStrip))); } else { double startStrip = stripLine.Start; double endStrip = double.IsNaN(stripLine.RepeatUntil) ? visibleRange.End : stripLine.RepeatUntil; double periodStrip = stripLine.RepeatEvery; if (!double.IsNaN(stripLine.SegmentStartValue) && !double.IsNaN(stripLine.SegmentEndValue)) { do { double y1 = Area.ValueToPoint(axis, startStrip); double y2; if (stripLine.IsPixelWidth) { y2 = y1 - stripLine.Width; } else { double stripEnd = (!double.IsNaN(stripLine.RepeatUntil) ? (startStrip < stripLine.RepeatUntil) ? startStrip + stripLine.Width : startStrip - stripLine.Width : startStrip + stripLine.Width); y2 = Area.ValueToPoint(axis, stripEnd); } axis.StriplineYRange += new DoubleRange(startStrip, Area.PointToValue(axis, new Point(0, y2))); if (axis.Area != null && axis.Area.InternalPrimaryAxis != null) { double startVal = Area.ValueToPoint(xAxis, stripLine.SegmentStartValue); double endVal = Area.ValueToPoint(xAxis, stripLine.SegmentEndValue); stripRect = new Rect(new Point(startVal, y1), new Point(endVal, y2)); RenderStripLine(stripRect, stripLine); if ((axis as ChartAxisBase2D).IncludeStripLineRange) { axis.StriplineXRange += new DoubleRange(stripLine.SegmentStartValue, stripLine.SegmentEndValue); } } startStrip = startStrip < endStrip ? startStrip + periodStrip : startStrip - periodStrip; }while (periodStrip != 0 && (Double.IsNaN(stripLine.RepeatUntil) ? startStrip < endStrip : (stripLine.Start < stripLine.RepeatUntil ? startStrip <endStrip : startStrip> endStrip))); } } } } } }
/// <summary> /// Updates the horizontal stripline. /// </summary> /// <param name="axis">The Relevant Axis</param> private void UpdateHorizontalStripLine(ChartAxisBase2D axis) { var seriesRect = Area.SeriesClipRect; var visibleRange = axis.VisibleRange; Rect xAxisRect = axis.ArrangeRect; axis.StriplineXRange = DoubleRange.Empty; axis.StriplineYRange = DoubleRange.Empty; foreach (var stripLine in axis.StripLines) { IEnumerable <ChartAxis> yAxes; ChartAxis cusAxis = Area.Axes[stripLine.SegmentAxisName]; if (cusAxis != null) { yAxes = new List <ChartAxis> { cusAxis }; } else if (axis.RegisteredSeries.Count > 0) { yAxes = (Area.RowDefinitions.Count > 1) ? axis.AssociatedAxes : axis.AssociatedAxes.DistinctBy(Area.GetActualRow); //WPF-13976-StripLine not working while using RowDefinitions } else { yAxes = new List <ChartAxis> { Area.InternalSecondaryAxis }; } foreach (var currAxis in yAxes) { var count = axis.RegisteredSeries.Where(item => (item.ActualXAxis == currAxis || item.ActualYAxis == currAxis)).Count(); //stripline drawn for all the yaxis in the chart area .hence it is filtered using its associated axis -WPF-13976 if (count == 0 && axis.RegisteredSeries.Count == 0) { count = 1; } if (count > 0) { var yAxisRect = currAxis.ArrangeRect; Rect stripRect; if (!stripLine.IsSegmented) { double startStrip = stripLine.Start; double endStrip = double.IsNaN(stripLine.RepeatUntil) ? visibleRange.End : stripLine.RepeatUntil; double periodStrip = stripLine.RepeatEvery; do { double stripStart = startStrip; double stripEnd = (!double.IsNaN(stripLine.RepeatUntil) ? (startStrip < stripLine.RepeatUntil) ? startStrip + stripLine.Width : startStrip - stripLine.Width : startStrip + stripLine.Width); double x1 = Area.ValueToPoint(axis, startStrip); double x2; if (stripLine.IsPixelWidth) { x2 = x1 + stripLine.Width; } else { x2 = Area.ValueToPoint(axis, stripEnd); } axis.StriplineXRange += new DoubleRange(stripStart, Area.PointToValue(axis, new Point(x2, 0))); axis.StriplineXRange += currAxis.StriplineXRange; double left = xAxisRect.Width + xAxisRect.Left - seriesRect.Left; x2 = left > x2 ? x2 : left;//WPF-12981-Striplines are cut when we set plotoffset to primaryaxis stripRect = new Rect(new Point(x1, yAxisRect.Top - seriesRect.Top), new Point(x2, yAxisRect.Height + yAxisRect.Top - seriesRect.Top)); RenderStripLine(stripRect, stripLine); startStrip = startStrip < endStrip ? startStrip + periodStrip : startStrip - periodStrip; }while (periodStrip != 0 && (Double.IsNaN(stripLine.RepeatUntil) ? startStrip < endStrip : (stripLine.Start < stripLine.RepeatUntil ? startStrip <endStrip : startStrip> endStrip))); } else { double startStrip = stripLine.Start; double endStrip = double.IsNaN(stripLine.RepeatUntil) ? visibleRange.End : stripLine.RepeatUntil; double periodStrip = stripLine.RepeatEvery; if (!double.IsNaN(stripLine.SegmentStartValue) && !double.IsNaN(stripLine.SegmentEndValue)) { do { double x1 = Area.ValueToPoint(axis, startStrip); double x2; if (stripLine.IsPixelWidth) { x2 = x1 + stripLine.Width; } else { double stripEnd = (!double.IsNaN(stripLine.RepeatUntil) ? (startStrip < stripLine.RepeatUntil) ? startStrip + stripLine.Width : startStrip - stripLine.Width : startStrip + stripLine.Width); x2 = Area.ValueToPoint(axis, stripEnd); } axis.StriplineXRange += new DoubleRange(startStrip, Area.PointToValue(axis, new Point(x2, 0))); axis.StriplineXRange += currAxis.StriplineXRange; if (axis.Area != null) { double startVal = Area.ValueToPoint(currAxis, stripLine.SegmentStartValue); double endVal = Area.ValueToPoint(currAxis, stripLine.SegmentEndValue); stripRect = new Rect(new Point(x1, startVal), new Point(x2, endVal)); RenderStripLine(stripRect, stripLine); if ((axis as ChartAxisBase2D).IncludeStripLineRange) { currAxis.StriplineYRange += new DoubleRange(stripLine.SegmentStartValue, stripLine.SegmentEndValue); } } startStrip = startStrip < endStrip ? startStrip + periodStrip : startStrip - periodStrip; }while (periodStrip != 0 && (Double.IsNaN(stripLine.RepeatUntil) ? startStrip < endStrip : (stripLine.Start < stripLine.RepeatUntil ? startStrip <endStrip : startStrip> endStrip))); } } } } } }
/// <summary> /// Generates the visible labels. /// </summary> /// <param name="axis">The axis.</param> /// <param name="intervalType">Type of the interval.</param> /// Method implementation for Create VisibleLabels for DateTime axis internal static void GenerateVisibleLabels(ChartAxisBase2D axis, object minimum, object maximum, DateTimeIntervalType intervalType) { var startDate = axis.VisibleRange.Start.FromOADate(); DateTime alignedDate; var interval = IncreaseInterval(startDate, axis.VisibleInterval, intervalType).ToOADate() - axis.VisibleRange.Start; if (axis.EdgeLabelsVisibilityMode == EdgeLabelsVisibilityMode.AlwaysVisible || (axis.EdgeLabelsVisibilityMode == EdgeLabelsVisibilityMode.Visible && !axis.IsZoomed)) { alignedDate = startDate; } else { alignedDate = AlignRangeStart(startDate, axis.VisibleInterval, intervalType); } var dateTimeAxis = axis as DateTimeAxis; var days = ""; double distinctDate = 0d; double position = alignedDate.ToOADate(); if (dateTimeAxis != null && dateTimeAxis.EnableBusinessHours) { days = dateTimeAxis.InternalWorkingDays; alignedDate = new DateTime(startDate.Year, startDate.Month, startDate.Day).AddHours(dateTimeAxis.OpenTime); position = alignedDate.ToOADate(); } double previousPosition = double.NaN; if (axis.IsDefaultRange && dateTimeAxis.Interval != 0) { if (intervalType == DateTimeIntervalType.Minutes) { axis.VisibleRange = new DoubleRange(0, 0.041); } else if (intervalType == DateTimeIntervalType.Seconds) { axis.VisibleRange = new DoubleRange(0, 0.041 / 60); } else if (intervalType == DateTimeIntervalType.Milliseconds) { axis.VisibleRange = new DoubleRange(0, 0.041 / 3600); } } while (position <= axis.VisibleRange.End) { if (position == previousPosition) { break; } if (axis.VisibleRange.Inside(position)) { var dateTimeAxisLabel = new DateTimeAxisLabel(position, alignedDate.ToString(axis.LabelFormat, CultureInfo.CurrentCulture), position); dateTimeAxisLabel.IntervalType = dateTimeAxis.ActualIntervalType; dateTimeAxisLabel.IsTransition = GetTransitionState(ref distinctDate, alignedDate, dateTimeAxis.ActualIntervalType); axis.VisibleLabels.Add(dateTimeAxisLabel); } alignedDate = IncreaseNonWorkingInterval(days, dateTimeAxis, alignedDate, axis.VisibleInterval, intervalType); if (dateTimeAxis != null && dateTimeAxis.EnableBusinessHours) { alignedDate = NonWorkingDaysIntervals(dateTimeAxis, alignedDate, interval, intervalType); } if (axis.smallTicksRequired) { axis.AddSmallTicksPoint(position, interval); } previousPosition = position; position = alignedDate.ToOADate(); } double rangeEnd = axis.VisibleRange.End; if (((maximum != null && rangeEnd.FromOADate().Equals(maximum)) || axis.EdgeLabelsVisibilityMode == EdgeLabelsVisibilityMode.AlwaysVisible || (axis.EdgeLabelsVisibilityMode == EdgeLabelsVisibilityMode.Visible && !axis.IsZoomed)) && !rangeEnd.Equals(position - interval)) { var dateTimeAxisLabel = new DateTimeAxisLabel( rangeEnd, alignedDate.ToString( axis.LabelFormat, CultureInfo.CurrentCulture), rangeEnd); dateTimeAxisLabel.IntervalType = dateTimeAxis.ActualIntervalType; dateTimeAxisLabel.IsTransition = GetTransitionState(ref distinctDate, alignedDate, dateTimeAxis.ActualIntervalType); axis.VisibleLabels.Add(dateTimeAxisLabel); } }
/// <summary> /// Measures the elements in the panel. /// </summary> /// <param name="availableSize">available size of the panel.</param> /// <returns>Returns the desired size</returns> public Size Measure(Size availableSize) { left = right = top = bottom = 0; if (Area.ColumnDefinitions.Count == 0) { Area.ColumnDefinitions.Add(new ChartColumnDefinition()); } if (Area.RowDefinitions.Count == 0) { Area.RowDefinitions.Add(new ChartRowDefinition()); } foreach (ChartColumnDefinition column in Area.ColumnDefinitions) { column.Axis.Clear(); } foreach (ChartRowDefinition row in Area.RowDefinitions) { row.Axis.Clear(); } foreach (ChartAxis content in Area.Axes) { if (content.DisableScrollbar) { ChartAxisBase2D chartAxisBase2D = content as ChartAxisBase2D; if (chartAxisBase2D != null) { chartAxisBase2D.EnableScrollBar = true; } } if (content.Orientation == Orientation.Horizontal) { Area.ColumnDefinitions[Area.GetActualColumn(content)].Axis.Add(content); } else { Area.RowDefinitions[Area.GetActualRow(content)].Axis.Add(content); } } // Spanning calculation for each axis if (Area != null) { AxisSpanCalculation(); } leftSizes.Clear(); rightSizes.Clear(); topSizes.Clear(); bottomSizes.Clear(); MeasureAxis(availableSize, new Rect(new Point(0, 0), availableSize)); Area.AxisThickness = new Thickness(left, top, right, bottom); // Area.SeriesClipRect = rect; UpdateArrangeRect(availableSize); Rect rect = ChartLayoutUtils.Subtractthickness(new Rect(new Point(0, 0), availableSize), this.Area.AxisThickness); currentAvalilableSize = availableSize; Area.SeriesClipRect = rect; foreach (ChartSeriesBase series in Area.VisibleSeries.OfType <ISupportAxes>()) { if (series.ActualXAxis != null && series.ActualYAxis != null) { ChartAxis xAxis = series.ActualXAxis.Orientation == Orientation.Horizontal ? series.ActualXAxis : series.ActualYAxis; ChartAxis yAxis = series.ActualYAxis.Orientation == Orientation.Vertical ? series.ActualYAxis : series.ActualXAxis; var x = xAxis.ArrangeRect.Left - rect.Left; var y = yAxis.ArrangeRect.Top - rect.Top; var width = xAxis.ArrangeRect.Width; var height = yAxis.ArrangeRect.Height; series.Clip = new RectangleGeometry() { Rect = new Rect(x, y, width + 0.5, height + 0.5) }; } } _desiredSize = availableSize; return(availableSize); }
// To set the properties of corresponding textblock and brace's polyline internal void SetBraceVisualBinding(TextBlock textBlock, Shape polyline1, Shape polyline2, ChartAxisBase2D axis) { Binding binding = new Binding() { Source = this, Path = new PropertyPath("FontSize") }; textBlock.SetBinding(TextBlock.FontSizeProperty, binding); binding = new Binding() { Source = this, Path = new PropertyPath("Foreground") }; textBlock.SetBinding(TextBlock.ForegroundProperty, binding); binding = new Binding() { Source = this, Path = new PropertyPath("FontFamily") }; textBlock.SetBinding(TextBlock.FontFamilyProperty, binding); binding = new Binding() { Source = this, Path = new PropertyPath("Text") }; textBlock.SetBinding(TextBlock.TextProperty, binding); textBlock.Tag = this; binding = new Binding() { Source = axis, Path = new PropertyPath("LabelBorderBrush") }; polyline1.SetBinding(Shape.StrokeProperty, binding); binding = new Binding() { Source = axis, Path = new PropertyPath("LabelBorderBrush") }; polyline2.SetBinding(Shape.StrokeProperty, binding); binding = new Binding() { Source = axis, Path = new PropertyPath("LabelBorderWidth") }; polyline1.SetBinding(Shape.StrokeThicknessProperty, binding); binding = new Binding() { Source = axis, Path = new PropertyPath("LabelBorderWidth") }; polyline2.SetBinding(Shape.StrokeThicknessProperty, binding); }