/// <summary> /// Converts a chart values pair to pixels /// </summary> /// <param name="chart">Target chart</param> /// <param name="chartPoint">point in screen</param> /// <param name="axisX">axis x index</param> /// <param name="axisY">axis y index</param> /// <returns></returns> public static Point ConvertToPixels(this Chart chart, Point chartPoint, int axisX = 0, int axisY = 0) { if (chart.Model == null || chart.AxisX.Any(x => x.Model == null)) { return(new Point()); } var uw = new CorePoint( chart.AxisX[axisX].Model.EvaluatesUnitWidth ? ChartFunctionsNew.GetUnitWidth(AxisOrientationNew.X, chart.Model, axisX) / 2 : 0, chart.AxisY[axisY].Model.EvaluatesUnitWidth ? ChartFunctionsNew.GetUnitWidth(AxisOrientationNew.Y, chart.Model, axisY) / 2 : 0); return(new Point( ChartFunctionsNew.ToPlotArea(chartPoint.X, AxisOrientationNew.X, chart.Model, axisX) + uw.X, ChartFunctionsNew.ToPlotArea(chartPoint.Y, AxisOrientationNew.Y, chart.Model, axisY) + uw.Y)); }
private void PlaceLabel(string text, AxisCoreNew axis, AxisOrientationNew source) { _label.Text = text; var formattedText = new FormattedText( _label.Text, CultureInfo.CurrentUICulture, FlowDirection.LeftToRight, new Typeface(_label.FontFamily, _label.FontStyle, _label.FontWeight, _label.FontStretch), _label.FontSize, Brushes.Black); var transform = new LabelEvaluation(axis.View.LabelsRotation, formattedText.Width + 10, formattedText.Height, axis, source); _label.RenderTransform = Math.Abs(transform.LabelAngle) > 1 ? new RotateTransform(transform.LabelAngle) : null; var toLine = ChartFunctionsNew.ToPlotArea(Value + SectionOffset + SectionWidth * .5, source, Model.Chart, axis); var direction = source == AxisOrientationNew.X ? 1 : -1; toLine += axis.EvaluatesUnitWidth ? direction * ChartFunctionsNew.GetUnitWidth(source, Model.Chart, axis) / 2 : 0; var toLabel = toLine + transform.GetOffsetBySource(source); var chart = Model.Chart; if (axis.IsMerged) { const double padding = 4; if (source == AxisOrientationNew.Y) { if (toLabel + transform.ActualHeight > chart.DrawMargin.Top + chart.DrawMargin.Height) { toLabel -= transform.ActualHeight + padding; } } else { if (toLabel + transform.ActualWidth > chart.DrawMargin.Left + chart.DrawMargin.Width) { toLabel -= transform.ActualWidth + padding; } } } var labelTab = axis.Tab; labelTab += transform.GetOffsetBySource(source.Invert()); if (source == AxisOrientationNew.Y) { labelTab += 8 * (axis.Position == AxisPositionNew.LeftBottom ? 1 : -1); if (Model.View.DisableAnimations || DisableAnimations) { Canvas.SetLeft(_label, labelTab); Canvas.SetTop(_label, toLabel); return; } _label.BeginAnimation(Canvas.TopProperty, new DoubleAnimation(toLabel, chart.View.AnimationsSpeed)); _label.BeginAnimation(Canvas.LeftProperty, new DoubleAnimation(labelTab, chart.View.AnimationsSpeed)); } else { if (Model.View.DisableAnimations || DisableAnimations) { Canvas.SetLeft(_label, toLabel); Canvas.SetTop(_label, labelTab); return; } _label.BeginAnimation(Canvas.LeftProperty, new DoubleAnimation(toLabel, chart.View.AnimationsSpeed)); _label.BeginAnimation(Canvas.TopProperty, new DoubleAnimation(labelTab, chart.View.AnimationsSpeed)); } }