예제 #1
0
        internal override void Arrange(RadRect availableRect)
        {
            // arrange title
            double titleTop = 0d;

            if (this.owner.VerticalLocation == AxisVerticalLocation.Bottom)
            {
                titleTop = availableRect.Bottom - this.owner.title.desiredSize.Height;
            }
            else
            {
                titleTop         = availableRect.Y;
                availableRect.Y += this.owner.title.desiredSize.Height;
            }

            this.owner.title.Arrange(new RadRect(
                                         availableRect.X + ((availableRect.Width - this.owner.title.desiredSize.Width) / 2),
                                         titleTop,
                                         this.owner.title.desiredSize.Width,
                                         this.owner.title.desiredSize.Height));

            // scale by the zoom factor
            availableRect.Width *= this.owner.GetChartArea().view.ZoomWidth;

            // arrange ticks
            double x;
            double y;

            if (this.owner.VerticalLocation == AxisVerticalLocation.Bottom)
            {
                y = availableRect.Y;
            }
            else
            {
                y = availableRect.Y + this.totalLabelHeight + this.owner.LineThickness;
            }
            double thickness       = this.owner.TickThickness;
            double thicknessOffset = (int)(thickness / 2);

            foreach (AxisTickModel tick in this.owner.ticks)
            {
                if (tick.normalizedValue == 0)
                {
                    x = availableRect.X - thicknessOffset;
                }
                else if (tick.normalizedValue == 1)
                {
                    x = availableRect.X + availableRect.Width;
                }
                else
                {
                    x = availableRect.X + ((double)tick.normalizedValue * availableRect.Width) - thicknessOffset;
                }

                tick.Arrange(new RadRect(x, y, thickness, this.owner.GetTickLength(tick)));
            }

            // arrange labels
            if (this.owner.VerticalLocation == AxisVerticalLocation.Bottom)
            {
                this.labelTop = availableRect.Y + this.owner.MajorTickLength;
            }
            else
            {
                this.labelTop = availableRect.Y;
            }

            LabelArranger labelFitStrategy = this.ArrangeLabelNone;

            if (this.owner.labelFitMode == AxisLabelFitMode.MultiLine)
            {
                labelFitStrategy = this.ArrangeLabelMultiline;
            }

            foreach (AxisLabelModel label in this.owner.labels)
            {
                labelFitStrategy(label, availableRect);
            }
        }
        void Render()
        {
            if (!_loaded || UpdateCount > 0)
            {
                return;
            }

            if (Chart != null)
            {
                var prect = Chart.View.PlotRect;
                var bnds  = new Rect(0, 0, prect.Width, prect.Height);
                bnds.Inflate(1, 1);

                var offset = Chart.TranslatePoint(new Point(), (UIElement)this.Parent);
                offset.X = prect.X - offset.X;
                offset.Y = prect.Y - offset.Y;

                foreach (var label in Children)
                {
                    if (!base.Children.Contains(label))
                    {
                        base.Children.Add(label);
                    }
                    var line = label.ConnectingLine;
                    if (!base.Children.Contains(line))
                    {
                        base.Children.Add(line);
                    }


                    if (!Chart.ChartType.ToString().StartsWith("Pie"))
                    {
                        label.UpdateAttachPoint(Chart, offset);

                        if (bnds.Contains(label.AttachPoint))
                        {
                            label.Visibility = Visibility.Visible;
                        }
                        else
                        {
                            label.Visibility = Visibility.Collapsed;
                        }
                    }
                    else
                    {
                        label.UpdateAttachPoint(Chart, new Point());
                    }
                }

                if (LabelArranger != null)
                {
                    LabelArranger.Arrange(Children.ToArray(), OccupiedRects, new Rect(0, 0, prect.Width, prect.Height));
                }

                foreach (var label in Children)
                {
                    var line = label.ConnectingLine;
                    var pt   = label.AttachPoint;

                    line.X1 = pt.X; line.Y1 = pt.Y;

                    var pt1 = LabelHelper.GetConnectingPoint(label);

                    if (!double.IsNaN(pt1.X) && !double.IsNaN(pt1.Y))
                    {
                        line.X2 = pt1.X; line.Y2 = pt1.Y;
                    }
                }

                _state = new ChartState(Chart);
            }
        }