Пример #1
0
        /// <summary>
        /// Updates this instance.
        /// </summary>
        internal void Update()
        {
            double desiredWidth = 0;

            CalculateAutoInterval();
            GenerateLabels();
            if (this.ActualHeight > 0 && this.ActualWidth > 0)
            {
                double yAxisHeightStep     = this.ActualHeight / ((MIntervalCount > 0) ? MIntervalCount : 1);
                double yAxisHeightPosition = 0;
                Rect   oldRect             = new Rect(0, 0, 0, 0);
                AxisLine.X1 = this.ActualWidth;
                AxisLine.X2 = this.ActualWidth;
                AxisLine.Y1 = 0;
                AxisLine.Y2 = this.ActualHeight;
                Binding binding = new Binding();
                binding.Path   = new PropertyPath("AxisLineStyle");
                binding.Source = this;
                AxisLine.SetBinding(Line.StyleProperty, binding);
                double labelSize  = 0;
                int    minorCount = 0;
                if (this.MLabels.Count == Labels.Count)
                {
                    for (int i = this.MLabels.Count - 1; i >= 0; i--)
                    {
                        yAxisHeightPosition = this.DataToPoint(MLabelValues[i]);
                        ContentControl label = Labels[i];
                        label.Content = MLabels[i];
                        label.Measure(new Size(this.ActualHeight, this.ActualWidth));
                        RotateTransform labelRotation = new RotateTransform();
                        labelRotation.Angle = LabelAngle;
                        Rect rotatedRect = GetRotatedRect(new Rect(0, 0, label.DesiredSize.Width, label.DesiredSize.Height), labelRotation);
                        label.RenderTransform = labelRotation;
                        Line   tickLine     = MajorTickLines[i];
                        double labelPadding = 0;
                        tickLine.Measure(new Size(this.ActualHeight, this.ActualWidth));
                        //tickLine.X1 = this.ActualWidth;
                        tickLine.Y1 = yAxisHeightPosition;
                        tickLine.Y2 = yAxisHeightPosition;
                        //tickLine.X2 = tickLine.X1 - MajorLineSize;
                        switch (MajorTicksPosition)
                        {
                        case TickPosition.Inside:
                            tickLine.X1 = this.ActualWidth;
                            tickLine.X2 = tickLine.X1 + MajorLineSize;
                            if (this.ShowMajorTicks)
                            {
                                labelPadding = 0;
                                desiredWidth = 0;
                            }
                            break;

                        case TickPosition.Cross:
                            tickLine.X1 = this.ActualWidth - (MajorLineSize / 2);
                            tickLine.X2 = this.ActualWidth + (MajorLineSize / 2);
                            if (this.ShowMajorTicks)
                            {
                                labelPadding = tickLine.X2;
                                desiredWidth = this.MajorLineSize / 2;
                            }
                            break;

                        case TickPosition.Outside:
                            tickLine.X1 = this.ActualWidth;
                            tickLine.X2 = tickLine.X1 - MajorLineSize;
                            if (this.ShowMajorTicks)
                            {
                                labelPadding = tickLine.X2;
                                desiredWidth = this.MajorLineSize;
                            }
                            break;

                        default:
                            break;
                        }
                        //desiredWidth = 0;
                        if (i != 0)
                        {
                            double minorWidth = yAxisHeightStep;
                            double minorstep  = minorWidth / (MinorTicksCount + 1);
                            for (int j = 0; j < this.MinorTicksCount; j++)
                            {
                                Line minorLine = MinorTickLines[minorCount];
                                minorLine.Y1 = (yAxisHeightPosition + minorstep * (j + 1));
                                minorLine.Y2 = (yAxisHeightPosition + minorstep * (j + 1));
                                //minorLine.X1 = this.ActualWidth - (minorLine.StrokeThickness);
                                // minorLine.X2 = minorLine.X1 - MinorLineSize;
                                switch (MinorTicksPosition)
                                {
                                case TickPosition.Inside:
                                    minorLine.X1 = this.ActualWidth;
                                    minorLine.X2 = minorLine.X1 + MinorLineSize;
                                    break;

                                case TickPosition.Cross:
                                    minorLine.X1 = this.ActualWidth - (MinorLineSize / 2);
                                    minorLine.X2 = this.ActualWidth + (MinorLineSize / 2);
                                    break;

                                case TickPosition.Outside:
                                    minorLine.X1 = this.ActualWidth;
                                    minorLine.X2 = minorLine.X1 - MinorLineSize;
                                    break;

                                default:
                                    break;
                                }
                                minorCount++;
                            }
                        }

                        if (this.LabelAngle == 0)
                        {
                            Canvas.SetLeft(label, this.ActualWidth - (label.DesiredSize.Width) - desiredWidth - 1);
                            Canvas.SetTop(label, yAxisHeightPosition - (label.DesiredSize.Height / 2));
                            labelSize = Math.Max(labelSize, label.DesiredSize.Width);
                        }
                        else
                        {
                            Canvas.SetLeft(label, this.ActualWidth - (rotatedRect.Width) - rotatedRect.X - desiredWidth - 1);
                            Canvas.SetTop(label, yAxisHeightPosition - (rotatedRect.Height / 2) - rotatedRect.Y);
                            labelSize = Math.Max(labelSize, rotatedRect.Width);
                        }
                    }
                }
                else
                {
                    if (this.MLabels.Count > Labels.Count)
                    {
                        int offset = this.MLabels.Count - Labels.Count;
                        for (int j = 0; j < offset; j++)
                        {
                            ContentControl label = new ContentControl();
                            label.Content = MLabels[this.MLabels.Count - offset - 1];
                            //label.ContentTemplate = this.LabelTemplate;
                            Binding labelTemplateBinding = new Binding();
                            labelTemplateBinding.Path   = new PropertyPath("LabelTemplate");
                            labelTemplateBinding.Source = this;
                            label.SetBinding(ContentControl.ContentTemplateProperty, labelTemplateBinding);
                            label.Measure(new Size(this.ActualHeight, this.ActualWidth));
                            RotateTransform labelRotation = new RotateTransform();
                            labelRotation.Angle = LabelAngle;
                            Rect rotatedRect = GetRotatedRect(new Rect(0, 0, label.DesiredSize.Width, label.DesiredSize.Height), labelRotation);
                            label.RenderTransform = labelRotation;
                            Labels.Add(label);
                            Line    tickLine     = new Line();
                            Binding styleBinding = new Binding();
                            styleBinding.Path   = new PropertyPath("MajorLineStyle");
                            styleBinding.Source = this;
                            tickLine.SetBinding(Line.StyleProperty, styleBinding);
                            tickLine.Measure(new Size(this.ActualHeight, this.ActualWidth));
                            tickLine.Y1 = yAxisHeightPosition;
                            tickLine.Y2 = yAxisHeightPosition;
                            //tickLine.X2 = tickLine.X1 - MajorLineSize;
                            switch (MajorTicksPosition)
                            {
                            case TickPosition.Inside:
                                tickLine.X1 = this.ActualWidth;
                                tickLine.X2 = tickLine.X1 + MajorLineSize;
                                break;

                            case TickPosition.Cross:
                                tickLine.X1 = this.ActualWidth - (MajorLineSize / 2);
                                tickLine.X2 = this.ActualWidth + (MajorLineSize / 2);
                                break;

                            case TickPosition.Outside:
                                tickLine.X1 = this.ActualWidth;
                                tickLine.X2 = tickLine.X1 - MajorLineSize;
                                break;

                            default:
                                break;
                            }
                            //Binding tickSizeBinding = new Binding();
                            //tickSizeBinding.Path = new PropertyPath("MajorLineSize");
                            //tickSizeBinding.Source = this;
                            //tickSizeBinding.Converter = new MajorSizeThicknessConverter();
                            //tickSizeBinding.ConverterParameter = tickLine.X1;
                            //tickLine.SetBinding(Line.X2Property, tickSizeBinding);
                            Binding ticklineVisibilityBinding = new Binding();
                            ticklineVisibilityBinding.Path      = new PropertyPath("ShowMajorTicks");
                            ticklineVisibilityBinding.Source    = this;
                            ticklineVisibilityBinding.Converter = new BooleanToVisibilityConverter();
                            tickLine.SetBinding(Line.VisibilityProperty, ticklineVisibilityBinding);
                            double minorWidth = yAxisHeightStep;
                            double minorstep  = minorWidth / (MinorTicksCount + 1);
                            for (int k = 0; k < this.MinorTicksCount; j++)
                            {
                                Line    minorLine         = new Line();
                                Binding minorstyleBinding = new Binding();
                                minorstyleBinding.Path   = new PropertyPath("MinorLineStyle");
                                minorstyleBinding.Source = this;
                                minorLine.SetBinding(Line.StyleProperty, minorstyleBinding);
                                minorLine.Measure(new Size(this.ActualHeight, this.ActualWidth));
                                minorLine.Y1 = (yAxisHeightPosition + minorstep * (j + 1));
                                minorLine.Y2 = (yAxisHeightPosition + minorstep * (j + 1));
                                switch (MinorTicksPosition)
                                {
                                case TickPosition.Inside:
                                    minorLine.X1 = this.ActualWidth;
                                    minorLine.X2 = minorLine.X1 + MinorLineSize;
                                    break;

                                case TickPosition.Cross:
                                    minorLine.X1 = this.ActualWidth - (MinorLineSize / 2);
                                    minorLine.X2 = this.ActualWidth + (MinorLineSize / 2);
                                    break;

                                case TickPosition.Outside:
                                    minorLine.X1 = this.ActualWidth;
                                    minorLine.X2 = minorLine.X1 - MinorLineSize;
                                    break;

                                default:
                                    break;
                                }
                                MinorTickLines.Add(minorLine);
                                this.Children.Add(minorLine);
                            }
                            this.Children.Add(label);
                            MajorTickLines.Add(tickLine);
                            this.Children.Add(tickLine);
                        }
                    }
                    else
                    {
                        int offset = Labels.Count - this.MLabels.Count;
                        for (int j = 0; j < offset; j++)
                        {
                            this.Children.Remove(Labels[Labels.Count - 1]);
                            Labels.RemoveAt(Labels.Count - 1);
                            for (int k = 0; k < this.MinorTicksCount; k++)
                            {
                                this.Children.Remove(MinorTickLines[MinorTickLines.Count - 1]);
                                MinorTickLines.RemoveAt(MinorTickLines.Count - 1);
                            }
                            this.Children.Remove(MajorTickLines[MajorTickLines.Count - 1]);
                            MajorTickLines.RemoveAt(MajorTickLines.Count - 1);
                        }
                    }
                    for (int i = this.MLabels.Count - 1; i >= 0; i--)
                    {
                        ContentControl label = Labels[i];
                        label.Content = MLabels[i];
                        label.Measure(new Size(this.ActualHeight, this.ActualWidth));
                        RotateTransform labelRotation = new RotateTransform();
                        labelRotation.Angle = LabelAngle;
                        Rect rotatedRect = GetRotatedRect(new Rect(0, 0, label.DesiredSize.Width, label.DesiredSize.Height), labelRotation);
                        label.RenderTransform = labelRotation;
                        Line   tickLine     = MajorTickLines[i];
                        double labelPadding = 0;

                        tickLine.Y1 = yAxisHeightPosition;
                        tickLine.Y2 = yAxisHeightPosition;
                        switch (MajorTicksPosition)
                        {
                        case TickPosition.Inside:
                            tickLine.X1 = this.ActualWidth;
                            tickLine.X2 = tickLine.X1 + MajorLineSize;
                            if (this.ShowMajorTicks)
                            {
                                labelPadding = 0;
                                desiredWidth = 0;
                            }
                            break;

                        case TickPosition.Cross:
                            tickLine.X1 = this.ActualWidth - (MajorLineSize / 2);
                            tickLine.X2 = this.ActualWidth + (MajorLineSize / 2);
                            if (this.ShowMajorTicks)
                            {
                                labelPadding = tickLine.X2;
                                desiredWidth = this.MajorLineSize / 2;
                            }
                            break;

                        case TickPosition.Outside:
                            tickLine.X1 = this.ActualWidth;
                            tickLine.X2 = tickLine.X1 - MajorLineSize;
                            if (this.ShowMajorTicks)
                            {
                                labelPadding = tickLine.X2;
                                desiredWidth = this.MajorLineSize;
                            }
                            break;

                        default:
                            break;
                        }
                        tickLine.Measure(new Size(this.ActualHeight, this.ActualWidth));
                        //desiredWidth = 0;
                        double minorstep = 0;
                        if (!(i == 0))
                        {
                            double minorWidth = yAxisHeightStep;
                            minorstep = minorWidth / (MinorTicksCount + 1);
                            for (int j = 0; j < this.MinorTicksCount; j++)
                            {
                                Line minorLine = MinorTickLines[minorCount];
                                minorLine.Y1 = (yAxisHeightPosition + minorstep * (j + 1));
                                minorLine.Y2 = (yAxisHeightPosition + minorstep * (j + 1));
                                //minorLine.X1 = this.ActualWidth - (minorLine.StrokeThickness);
                                //minorLine.X2 = minorLine.X1 - MinorLineSize;
                                switch (MinorTicksPosition)
                                {
                                case TickPosition.Inside:
                                    minorLine.X1 = this.ActualWidth;
                                    minorLine.X2 = minorLine.X1 + MinorLineSize;
                                    break;

                                case TickPosition.Cross:
                                    minorLine.X1 = this.ActualWidth - (MinorLineSize / 2);
                                    minorLine.X2 = this.ActualWidth + (MinorLineSize / 2);
                                    break;

                                case TickPosition.Outside:
                                    minorLine.X1 = this.ActualWidth;
                                    minorLine.X2 = minorLine.X1 - MinorLineSize;
                                    break;

                                default:
                                    break;
                                }
                                minorCount++;
                            }
                        }

                        if (this.LabelAngle == 0)
                        {
                            Canvas.SetLeft(label, this.ActualWidth - (label.DesiredSize.Width) - desiredWidth - 1);
                            Canvas.SetTop(label, yAxisHeightPosition - (label.DesiredSize.Height / 2));
                            labelSize = Math.Max(labelSize, label.DesiredSize.Width);
                        }
                        else
                        {
                            Canvas.SetLeft(label, this.ActualWidth - (rotatedRect.Width - rotatedRect.X) - desiredWidth - 1);
                            Canvas.SetTop(label, yAxisHeightPosition - (rotatedRect.Height / 2) - rotatedRect.Y);
                            labelSize = Math.Max(labelSize, rotatedRect.Width);
                        }
                        yAxisHeightPosition += yAxisHeightStep;
                        //desiredWidth = desiredWidth + labelSize;
                    }
                }
                header.Measure(new Size(this.ActualHeight, this.ActualWidth));
                Canvas.SetLeft(header, this.ActualWidth - labelSize - header.DesiredSize.Height - this.MajorLineSize - 1);
                Canvas.SetTop(header, this.ActualHeight / 2);
                desiredWidth = desiredWidth + header.DesiredSize.Height + labelSize;
            }
            if (this.Chart.AxisWidth < desiredWidth)
            {
                this.Chart.AxisWidth = desiredWidth + 1;
            }
        }
Пример #2
0
        /// <summary>
        /// Updates this instance.
        /// </summary>
        internal void Update()
        {
            double desiredHeight = 0;
            double labelSize     = 0;

            CalculateAutoInterval();
            GenerateLabels();
            if (this.ActualHeight > 0 && this.ActualWidth > 0)
            {
                double xAxisWidthStep     = this.ActualWidth / ((MIntervalCount > 0) ? MIntervalCount : 1);
                double xAxisWidthPosition = 0;
                double minorstep          = 0;
                AxisLine.X2 = this.ActualWidth;
                Rect oldRect = new Rect(0, 0, 0, 0);

                if (this.MLabels.Count == Labels.Count)
                {
                    int k          = 0;
                    int minorCount = 0;
                    for (int i = 0; i < this.MLabels.Count; i++)
                    {
                        xAxisWidthPosition = this.DataToPoint(MStartValue + (MInterval * k));
                        ContentControl label = Labels[k];
                        label.Content = MLabels[k];
                        label.Measure(new Size(this.ActualHeight, this.ActualWidth));
                        RotateTransform labelRotation = new RotateTransform();
                        labelRotation.Angle = LabelAngle;
                        Rect originalRect = new Rect(0, 0, label.DesiredSize.Width, label.DesiredSize.Height);

                        Rect rotatedRect = GetRotatedRect(originalRect, labelRotation);
                        //label.RenderTransformOrigin = new Point(0.5, 0.5);
                        label.RenderTransform = labelRotation;
                        Line   tickLine     = MajorTickLines[k];
                        double labelPadding = 0;
                        tickLine.Measure(new Size(this.ActualHeight, this.ActualWidth));
                        tickLine.X1 = xAxisWidthPosition;
                        tickLine.X2 = xAxisWidthPosition;
                        switch (MajorTicksPosition)
                        {
                        case TickPosition.Inside:
                            if (this.ShowMajorTicks)
                            {
                                labelPadding  = 0;
                                desiredHeight = 0;
                            }
                            break;

                        case TickPosition.Cross:
                            if (this.ShowMajorTicks)
                            {
                                labelPadding  = tickLine.Y2;
                                desiredHeight = tickLine.Y2;
                            }
                            break;

                        case TickPosition.Outside:
                            if (this.ShowMajorTicks)
                            {
                                labelPadding  = tickLine.Y2;
                                desiredHeight = tickLine.Y2;
                            }
                            break;

                        default:
                            break;
                        }
                        if (!(i == this.MLabels.Count - 1))
                        {
                            double minorWidth = xAxisWidthStep;
                            minorstep = minorWidth / (MinorTicksCount + 1);
                            for (int j = 0; j < this.MinorTicksCount; j++)
                            {
                                Line minorLine = MinorTickLines[minorCount];
                                minorLine.X1 = (xAxisWidthPosition + minorstep * (j + 1));
                                minorLine.X2 = (xAxisWidthPosition + minorstep * (j + 1));
                                switch (MinorTicksPosition)
                                {
                                case TickPosition.Inside:
                                    minorLine.Y1 = 0;
                                    break;

                                case TickPosition.Cross:
                                    //minorLine.Y1 = MinorLineSize / 2;
                                    break;

                                case TickPosition.Outside:
                                    minorLine.Y1 = 0;
                                    break;

                                default:
                                    break;
                                }

                                minorCount++;
                            }
                        }

                        //Canvas.SetLeft(label, xAxisWidthPosition - (label.DesiredSize.Width / 2));
                        //Canvas.SetTop(label, desiredHeight);
                        if (this.LabelAngle == 0)
                        {
                            Canvas.SetLeft(label, xAxisWidthPosition - (label.DesiredSize.Width / 2));
                            Canvas.SetTop(label, desiredHeight);
                            labelSize = Math.Max(labelSize, label.DesiredSize.Height);
                        }
                        else
                        {
                            Canvas.SetLeft(label, xAxisWidthPosition - (rotatedRect.Width / 2) - rotatedRect.X);
                            Canvas.SetTop(label, desiredHeight - rotatedRect.Y);
                            labelSize = Math.Max(labelSize, rotatedRect.Height);
                        }
                        k++;
                    }
                }
                else
                {
                    if (this.MLabels.Count > Labels.Count)
                    {
                        int offset = this.MLabels.Count - Labels.Count;
                        for (int j = 0; j < offset; j++)
                        {
                            ContentControl label = new ContentControl();
                            label.Content = MLabels[this.MLabels.Count - offset - 1];
                            Binding labelTemplateBinding = new Binding();
                            labelTemplateBinding.Path   = new PropertyPath("LabelTemplate");
                            labelTemplateBinding.Source = this;
                            label.SetBinding(ContentControl.ContentTemplateProperty, labelTemplateBinding);
                            label.Measure(new Size(this.ActualHeight, this.ActualWidth));
                            RotateTransform labelRotation = new RotateTransform();
                            labelRotation.Angle = LabelAngle;
                            Rect rotatedRect = GetRotatedRect(new Rect(0, 0, label.DesiredSize.Width, label.DesiredSize.Height), labelRotation);
                            // label.RenderTransformOrigin = new Point(0.5, 0.5);
                            label.RenderTransform = labelRotation;
                            Labels.Add(label);
                            Line    tickLine     = new Line();
                            Binding styleBinding = new Binding();
                            styleBinding.Path   = new PropertyPath("MajorLineStyle");
                            styleBinding.Source = this;
                            tickLine.SetBinding(Line.StyleProperty, styleBinding);
                            tickLine.Measure(new Size(this.ActualHeight, this.ActualWidth));
                            tickLine.X1 = xAxisWidthPosition - (tickLine.DesiredSize.Width / 2);
                            tickLine.X2 = xAxisWidthPosition - (tickLine.DesiredSize.Width / 2);

                            switch (this.MajorTicksPosition)
                            {
                            case TickPosition.Inside:
                                tickLine.Y1 = 0;
                                Binding tickSizeInsideBinding = new Binding();
                                tickSizeInsideBinding.Path      = new PropertyPath("MajorLineSize");
                                tickSizeInsideBinding.Source    = this;
                                tickSizeInsideBinding.Converter = new NegativeConverter();
                                tickLine.SetBinding(Line.Y2Property, tickSizeInsideBinding);
                                if (this.ShowMajorTicks)
                                {
                                    desiredHeight = 0;
                                }
                                break;

                            case TickPosition.Cross:
                                Binding tickSizeNegativeCrossBinding = new Binding();
                                tickSizeNegativeCrossBinding.Path      = new PropertyPath("MajorLineSize");
                                tickSizeNegativeCrossBinding.Source    = this;
                                tickSizeNegativeCrossBinding.Converter = new NegativeHalfConverter();
                                tickLine.SetBinding(Line.Y1Property, tickSizeNegativeCrossBinding);
                                Binding tickSizeCrossBinding = new Binding();
                                tickSizeCrossBinding.Path      = new PropertyPath("MajorLineSize");
                                tickSizeCrossBinding.Source    = this;
                                tickSizeCrossBinding.Converter = new HalfValueConverter();
                                tickLine.SetBinding(Line.Y2Property, tickSizeCrossBinding);
                                if (this.ShowMajorTicks)
                                {
                                    desiredHeight = MajorLineSize / 2;
                                }
                                break;

                            case TickPosition.Outside:
                                tickLine.Y1 = 0;
                                Binding tickSizeBinding = new Binding();
                                tickSizeBinding.Path   = new PropertyPath("MajorLineSize");
                                tickSizeBinding.Source = this;
                                tickLine.SetBinding(Line.Y2Property, tickSizeBinding);
                                if (this.ShowMajorTicks)
                                {
                                    desiredHeight = MajorLineSize;
                                }
                                break;
                            }

                            Binding ticklineVisibilityBinding = new Binding();
                            ticklineVisibilityBinding.Path      = new PropertyPath("ShowMajorTicks");
                            ticklineVisibilityBinding.Source    = this;
                            ticklineVisibilityBinding.Converter = new BooleanToVisibilityConverter();
                            tickLine.SetBinding(Line.VisibilityProperty, ticklineVisibilityBinding);
                            double minorWidth = xAxisWidthStep;
                            minorstep = minorWidth / (MinorTicksCount + 1);
                            for (int k = 0; k < this.MinorTicksCount; k++)
                            {
                                Line    minorLine         = new Line();
                                Binding minorstyleBinding = new Binding();
                                minorstyleBinding.Path   = new PropertyPath("MinorLineStyle");
                                minorstyleBinding.Source = this;
                                minorLine.SetBinding(Line.StyleProperty, minorstyleBinding);
                                minorLine.Measure(new Size(this.ActualHeight, this.ActualWidth));
                                minorLine.X1 = (xAxisWidthPosition + minorstep);
                                minorLine.X2 = (xAxisWidthPosition + minorstep);
                                switch (MinorTicksPosition)
                                {
                                case TickPosition.Inside:
                                    minorLine.Y1 = 0;
                                    Binding minortickInsideSizeBinding = new Binding();
                                    minortickInsideSizeBinding.Path      = new PropertyPath("MinorLineSize");
                                    minortickInsideSizeBinding.Source    = this;
                                    minortickInsideSizeBinding.Converter = new NegativeConverter();
                                    minorLine.SetBinding(Line.Y2Property, minortickInsideSizeBinding);
                                    break;

                                case TickPosition.Cross:
                                    Binding minortickNegativeCrossSizeBinding = new Binding();
                                    minortickNegativeCrossSizeBinding.Path      = new PropertyPath("MinorLineSize");
                                    minortickNegativeCrossSizeBinding.Source    = this;
                                    minortickNegativeCrossSizeBinding.Converter = new NegativeHalfConverter();
                                    minorLine.SetBinding(Line.Y1Property, minortickNegativeCrossSizeBinding);

                                    Binding minortickCrossSizeBinding = new Binding();
                                    minortickCrossSizeBinding.Path      = new PropertyPath("MinorLineSize");
                                    minortickCrossSizeBinding.Source    = this;
                                    minortickCrossSizeBinding.Converter = new HalfValueConverter();
                                    minorLine.SetBinding(Line.Y2Property, minortickCrossSizeBinding);
                                    break;

                                case TickPosition.Outside:
                                    minorLine.Y1 = 0;
                                    Binding minortickSizeBinding = new Binding();
                                    minortickSizeBinding.Path   = new PropertyPath("MinorLineSize");
                                    minortickSizeBinding.Source = this;
                                    minorLine.SetBinding(Line.Y2Property, minortickSizeBinding);
                                    break;
                                }
                                MinorTickLines.Add(minorLine);
                                this.Children.Add(minorLine);
                                minorstep += minorstep;
                            }
                            MajorTickLines.Add(tickLine);
                            this.Children.Add(label);
                            this.Children.Add(tickLine);
                        }
                    }
                    else
                    {
                        int offset = Labels.Count - this.MLabels.Count;
                        for (int j = 0; j < offset; j++)
                        {
                            this.Children.Remove(Labels[Labels.Count - 1]);
                            Labels.RemoveAt(Labels.Count - 1);
                            for (int k = 0; k < this.MinorTicksCount; k++)
                            {
                                this.Children.Remove(MinorTickLines[MinorTickLines.Count - 1]);
                                MinorTickLines.RemoveAt(MinorTickLines.Count - 1);
                            }
                            this.Children.Remove(MajorTickLines[MajorTickLines.Count - 1]);
                            MajorTickLines.RemoveAt(MajorTickLines.Count - 1);
                        }
                    }
                    for (int i = 0; i < this.MLabels.Count; i++)
                    {
                        ContentControl label = Labels[i];
                        label.Content = MLabels[i];
                        label.Measure(new Size(this.ActualHeight, this.ActualWidth));
                        RotateTransform labelRotation = new RotateTransform();
                        labelRotation.Angle = LabelAngle;
                        Rect rotatedRect = GetRotatedRect(new Rect(0, 0, label.DesiredSize.Width, label.DesiredSize.Height), labelRotation);
                        //label.RenderTransformOrigin = new Point(0.5, 0.5);
                        label.RenderTransform = labelRotation;
                        Line   tickLine     = MajorTickLines[i];
                        double labelPadding = 0;
                        int    minorCount   = 0;
                        tickLine.X1 = xAxisWidthPosition;
                        tickLine.X2 = xAxisWidthPosition;
                        tickLine.Measure(new Size(this.ActualHeight, this.ActualWidth));

                        if (!(i == this.MLabels.Count - 1))
                        {
                            double minorWidth = xAxisWidthStep;
                            minorstep = minorWidth / (MinorTicksCount + 1);
                            for (int j = 0; j < this.MinorTicksCount; j++)
                            {
                                Line minorLine = MinorTickLines[minorCount];
                                minorLine.X1 = (xAxisWidthPosition + minorstep * (j + 1));
                                minorLine.X2 = (xAxisWidthPosition + minorstep * (j + 1));
                                minorCount++;
                            }
                        }

                        if (this.LabelAngle == 0)
                        {
                            Canvas.SetLeft(label, xAxisWidthPosition - (label.DesiredSize.Width / 2));
                            Canvas.SetTop(label, desiredHeight);
                            labelSize = Math.Max(labelSize, label.DesiredSize.Height);
                        }
                        else
                        {
                            Canvas.SetLeft(label, xAxisWidthPosition - (rotatedRect.Width / 2) - rotatedRect.X);
                            Canvas.SetTop(label, desiredHeight - rotatedRect.Y);
                            labelSize = Math.Max(labelSize, rotatedRect.Height);
                        }
                        xAxisWidthPosition += xAxisWidthStep;
                    }
                }
                desiredHeight += labelSize;
                header.Measure(new Size(this.ActualHeight, this.ActualWidth));
                Canvas.SetLeft(header, (this.ActualWidth / 2) - (header.DesiredSize.Width / 2));
                Canvas.SetTop(header, desiredHeight);
                desiredHeight        += header.DesiredSize.Height;
                this.Chart.AxisHeight = desiredHeight;
            }
            //if (this.Chart.AxisHeight < desiredHeight)
        }