/// <summary> /// Initializes a new instance of the <see cref="ChartCore"/> class. /// </summary> /// <param name="view">The view.</param> /// <param name="updater">The updater.</param> protected ChartCore(IChartView view, ChartUpdater updater) { View = view; Updater = updater; DrawMargin = new CoreRectangle(); DrawMargin.SetHeight += view.SetDrawMarginHeight; DrawMargin.SetWidth += view.SetDrawMarginWidth; DrawMargin.SetTop += view.SetDrawMarginTop; DrawMargin.SetLeft += view.SetDrawMarginLeft; }
public override void DrawOrMove(ChartPoint previousDrawn, ChartPoint current, int index, ChartCore chart) { var previosPbv = previousDrawn == null ? null : (HorizontalBezierPointView) previousDrawn.View; var y = chart.DrawMargin.Top + chart.DrawMargin.Height; Container.Segments.Remove(Segment); Container.Segments.Insert(index, Segment); ValidArea = new CoreRectangle(current.ChartLocation.X - 7.5, current.ChartLocation.Y - 7.5, 15, 15); if (IsNew) { if (previosPbv != null && !previosPbv.IsNew) { Segment.Point1 = previosPbv.Segment.Point3; Segment.Point2 = previosPbv.Segment.Point3; Segment.Point3 = previosPbv.Segment.Point3; if (DataLabel != null) { Canvas.SetTop(DataLabel, Canvas.GetTop(previosPbv.DataLabel)); Canvas.SetLeft(DataLabel, Canvas.GetLeft(previosPbv.DataLabel)); } if (Shape != null) { Canvas.SetTop(Shape, Canvas.GetTop(previosPbv.Shape)); Canvas.SetLeft(Shape, Canvas.GetLeft(previosPbv.Shape)); } } else { Segment.Point1 = new Point(Data.Point1.X, y); Segment.Point2 = new Point(Data.Point2.X, y); Segment.Point3 = new Point(Data.Point3.X, y); if (DataLabel != null) { Canvas.SetTop(DataLabel, y); Canvas.SetLeft(DataLabel, current.ChartLocation.X - DataLabel.ActualWidth*.5); } if (Shape != null) { Canvas.SetTop(Shape, y); Canvas.SetLeft(Shape, current.ChartLocation.X - Shape.Width*.5); } } } #region No Animated if (chart.View.DisableAnimations) { Segment.Point1 = Data.Point1.AsPoint(); Segment.Point2 = Data.Point2.AsPoint(); Segment.Point3 = Data.Point3.AsPoint(); if (HoverShape != null) { Canvas.SetLeft(HoverShape, current.ChartLocation.X - HoverShape.Width*.5); Canvas.SetTop(HoverShape, current.ChartLocation.Y - HoverShape.Height*.5); } if (Shape != null) { Canvas.SetLeft(Shape, current.ChartLocation.X - Shape.Width*.5); Canvas.SetTop(Shape, current.ChartLocation.Y - Shape.Height*.5); } if (DataLabel != null) { DataLabel.UpdateLayout(); var xl = CorrectXLabel(current.ChartLocation.X - DataLabel.ActualWidth * .5, chart); var yl = CorrectYLabel(current.ChartLocation.Y - DataLabel.ActualHeight * .5, chart); Canvas.SetLeft(DataLabel, xl); Canvas.SetTop(DataLabel, yl); } return; } #endregion Segment.BeginAnimation(BezierSegment.Point1Property, new PointAnimation(Segment.Point1, Data.Point1.AsPoint(), chart.View.AnimationsSpeed)); Segment.BeginAnimation(BezierSegment.Point2Property, new PointAnimation(Segment.Point2, Data.Point2.AsPoint(), chart.View.AnimationsSpeed)); Segment.BeginAnimation(BezierSegment.Point3Property, new PointAnimation(Segment.Point3, Data.Point3.AsPoint(), chart.View.AnimationsSpeed)); if (Shape != null) { if (double.IsNaN(Canvas.GetLeft(Shape))) { Canvas.SetLeft(Shape, current.ChartLocation.X - Shape.Width * .5); Canvas.SetTop(Shape, current.ChartLocation.Y - Shape.Height * .5); } else { Shape.BeginAnimation(Canvas.LeftProperty, new DoubleAnimation(current.ChartLocation.X - Shape.Width*.5, chart.View.AnimationsSpeed)); Shape.BeginAnimation(Canvas.TopProperty, new DoubleAnimation(current.ChartLocation.Y - Shape.Height * .5, chart.View.AnimationsSpeed)); } } if (DataLabel != null) { DataLabel.UpdateLayout(); var xl = CorrectXLabel(current.ChartLocation.X - DataLabel.ActualWidth*.5, chart); var yl = CorrectYLabel(current.ChartLocation.Y - DataLabel.ActualHeight*.5, chart); DataLabel.BeginAnimation(Canvas.LeftProperty, new DoubleAnimation(xl, chart.View.AnimationsSpeed)); DataLabel.BeginAnimation(Canvas.TopProperty, new DoubleAnimation(yl, chart.View.AnimationsSpeed)); } if (HoverShape != null) { Canvas.SetLeft(HoverShape, current.ChartLocation.X - HoverShape.Width*.5); Canvas.SetTop(HoverShape, current.ChartLocation.Y - HoverShape.Height*.5); } }
public override void PrepareAxes() { PivotZoomingAxis = AxisOrientation.None; View.Zoom = ZoomingOptions.None; if (View.Series.Any(x => !(x.Model is IPieSeries))) throw new LiveChartsException( "There is a invalid series in the series collection, " + "verify that all the series implement IPieSeries."); foreach (var xi in AxisX) { xi.S = 1; xi.MinLimit = View.Series.Select(x => x.Values.Limit1.Min) .DefaultIfEmpty(0).Min(); xi.MaxLimit = View.Series.Select(x => x.Values.Limit1.Max) .DefaultIfEmpty(0).Max(); if (Math.Abs(xi.MinLimit - xi.MaxLimit) < xi.S * .01) { xi.MinLimit -= xi.S; xi.MaxLimit += xi.S; } } foreach (var yi in AxisY) { //yi.CalculateSeparator(this, AxisTags.X); yi.MinLimit = View.Series.Select(x => x.Values.Limit2.Min) .DefaultIfEmpty(0).Min(); yi.MaxLimit = View.Series.Select(x => x.Values.Limit2.Max) .DefaultIfEmpty(0).Max(); if (Math.Abs(yi.MinLimit - yi.MaxLimit) < yi.S * .01) { yi.MinLimit -= yi.S; yi.MaxLimit += yi.S; } } StackPoints(View.Series, AxisOrientation.Y, 0); var curSize = new CoreRectangle(0, 0, ControlSize.Width, ControlSize.Height); curSize = PlaceLegend(curSize); DrawMargin.Top = curSize.Top; DrawMargin.Left = curSize.Left; DrawMargin.Width = curSize.Width; DrawMargin.Height = curSize.Height; }
/// <summary> /// Places the legend. /// </summary> /// <param name="drawMargin">The draw margin.</param> /// <returns></returns> /// <exception cref="System.ArgumentOutOfRangeException"></exception> public CoreRectangle PlaceLegend(CoreRectangle drawMargin) { var legendSize = View.LoadLegend(); const int padding = 10; switch (View.LegendLocation) { case LegendLocation.None: View.HideLegend(); break; case LegendLocation.Top: drawMargin.Top += legendSize.Height; drawMargin.Height -= legendSize.Height; View.ShowLegend(new CorePoint(ControlSize.Width * .5 - legendSize.Width * .5, 0)); break; case LegendLocation.Bottom: var bot = new CorePoint(ControlSize.Width*.5 - legendSize.Width*.5, ControlSize.Height - legendSize.Height); drawMargin.Height -= legendSize.Height; View.ShowLegend(new CorePoint(bot.X, ControlSize.Height - legendSize.Height)); break; case LegendLocation.Left: drawMargin.Left = drawMargin.Left + legendSize.Width; View.ShowLegend(new CorePoint(0, ControlSize.Height*.5 - legendSize.Height*.5)); break; case LegendLocation.Right: drawMargin.Width -= legendSize.Width + padding; View.ShowLegend(new CorePoint(ControlSize.Width - legendSize.Width, ControlSize.Height*.5 - legendSize.Height*.5)); break; default: throw new ArgumentOutOfRangeException(); } return drawMargin; }
/// <summary> /// Calculates the components and margin. /// </summary> public void CalculateComponentsAndMargin() { var curSize = new CoreRectangle(0, 0, ControlSize.Width, ControlSize.Height); curSize = PlaceLegend(curSize); const double padding = 4; for (int index = 0; index < AxisY.Count; index++) { var yi = AxisY[index]; var titleSize = yi.View.UpdateTitle(this, -90d); var biggest = yi.PrepareChart(AxisOrientation.Y, this); var x = curSize.Left; if (yi.Position == AxisPosition.LeftBottom) { yi.View.SetTitleLeft(x); curSize.Left += titleSize.Height + biggest.Width + padding; curSize.Width -= (titleSize.Height + biggest.Width + padding); yi.Tab = curSize.Left; } else { yi.View.SetTitleLeft(x + curSize.Width - titleSize.Height); curSize.Width -= (titleSize.Height + biggest.Width + padding); yi.Tab = curSize.Left + curSize.Width; } var uw = yi.EvaluatesUnitWidth ? ChartFunctions.GetUnitWidth(AxisOrientation.Y, this, index)/2 : 0; var topE = biggest.Top - uw; if (topE> curSize.Top) { var dif = topE - curSize.Top; curSize.Top += dif; curSize.Height -= dif; } var botE = biggest.Bottom - uw; if (botE > ControlSize.Height - (curSize.Top + curSize.Height)) { var dif = botE - (ControlSize.Height - (curSize.Top + curSize.Height)); curSize.Height -= dif; } } for (var index = 0; index < AxisX.Count; index++) { var xi = AxisX[index]; var titleSize = xi.View.UpdateTitle(this); var biggest = xi.PrepareChart(AxisOrientation.X, this); var top = curSize.Top; if (xi.Position == AxisPosition.LeftBottom) { xi.View.SetTitleTop(top + curSize.Height - titleSize.Height); curSize.Height -= (titleSize.Height + biggest.Height); xi.Tab = curSize.Top + curSize.Height; } else { xi.View.SetTitleTop(top); curSize.Top += titleSize.Height + biggest.Height; curSize.Height -= (titleSize.Height + biggest.Height); xi.Tab = curSize.Top; } //Notice the unit width is not exact at this point... var uw = xi.EvaluatesUnitWidth ? ChartFunctions.GetUnitWidth(AxisOrientation.X, this, index)/2 : 0; var leftE = biggest.Left - uw > 0 ? biggest.Left - uw : 0; if (leftE > curSize.Left) { var dif = leftE - curSize.Left; curSize.Left += dif; curSize.Width -= dif; foreach (var correctedAxis in AxisY .Where(correctedAxis => correctedAxis.Position == AxisPosition.LeftBottom)) { correctedAxis.Tab += dif; } } var rightE = biggest.Right - uw > 0 ? biggest.Right - uw : 0; if (rightE > ControlSize.Width - (curSize.Left + curSize.Width)) { var dif = rightE - (ControlSize.Width - (curSize.Left + curSize.Width)); curSize.Width -= dif; foreach (var correctedAxis in AxisY .Where(correctedAxis => correctedAxis.Position == AxisPosition.RightTop)) { correctedAxis.Tab -= dif; } } } DrawMargin.Top = curSize.Top; DrawMargin.Left = curSize.Left; DrawMargin.Width = curSize.Width; DrawMargin.Height = curSize.Height; for (var index = 0; index < AxisY.Count; index++) { var yi = AxisY[index]; yi.UpdateSeparators(AxisOrientation.Y, this, index); yi.View.SetTitleTop(curSize.Top + curSize.Height*.5 + yi.View.GetLabelSize().Width*.5); } for (var index = 0; index < AxisX.Count; index++) { var xi = AxisX[index]; xi.UpdateSeparators(AxisOrientation.X, this, index); xi.View.SetTitleLeft(curSize.Left + curSize.Width*.5 - xi.View.GetLabelSize().Width*.5); } }