Exemplo n.º 1
0
 protected internal virtual void AlignDefaultLabel(
     ChartAlignment verticalAlignemnt,
     ChartAlignment horizontalAlignment,
     double x,
     double y,
     ContentControl control)
 {
 }
Exemplo n.º 2
0
        internal void AlignAxisToolTipPolygon(
            ContentControl control,
            ChartAlignment verticalAlignemnt,
            ChartAlignment horizontalAlignment,
            double x,
            double y,
            ChartBehavior behavior)
        {
            double labelHeight              = control.DesiredSize.Height;
            double labelWidth               = control.DesiredSize.Width;
            double axisTipHypotenuse        = (2 * axisTipHeight) / Math.Sqrt(3);
            var    isChartTrackBallBehavior = behavior is ChartTrackBallBehavior;

            PointCollection polygonPoints = new PointCollection();

            polygonPoints.Add(new Point(0, 0));
            polygonPoints.Add(new Point(0, labelHeight));
            polygonPoints.Add(new Point(labelWidth, labelHeight));

            if (chartAxis.Orientation == Orientation.Horizontal)
            {
                polygonPoints.Add(new Point(labelWidth, 0));

                if (chartAxis.OpposedPosition)
                {
                    double tipPosition, leftTipWidth, rightTipWidth;
                    if ((control.Content as ChartPointInfo).Axis.CrosshairLabelTemplate == null && !isChartTrackBallBehavior)
                    {
                        control.Margin = new Thickness(0, -6, 0, 0);
                    }

                    if (((control.Content as ChartPointInfo).X - control.DesiredSize.Height <= ChartArea.SeriesClipRect.X))
                    {
                        if (isChartTrackBallBehavior)
                        {
                            AlignDefaultLabel(
                                ChartAlignment.Far,
                                ChartAlignment.Far,
                                ChartArea.SeriesClipRect.X,
                                (control.Content as ChartPointInfo).Y,
                                control);
                        }
                        else
                        {
                            AlignDefaultLabel(
                                verticalAlignemnt,
                                ChartAlignment.Far,
                                ChartArea.SeriesClipRect.X,
                                (control.Content as ChartPointInfo).Y,
                                control);
                        }

                        tipPosition   = (control.Content as ChartPointInfo).BaseX - ChartArea.SeriesClipRect.X;
                        leftTipWidth  = tipPosition - axisTipHypotenuse / 2;
                        rightTipWidth = tipPosition + axisTipHypotenuse / 2;

                        if (leftTipWidth < 0)
                        {
                            leftTipWidth = 0;
                        }

                        polygonPoints.Insert(2, (new Point(leftTipWidth, labelHeight)));
                        polygonPoints.Insert(3, (new Point(tipPosition, labelHeight + axisTipHeight)));
                        polygonPoints.Insert(4, (new Point(rightTipWidth, labelHeight)));
                    }
                    else if ((control.Content as ChartPointInfo).X + control.DesiredSize.Width
                             >= ChartArea.SeriesClipRect.X + ChartArea.SeriesClipRect.Width)
                    {
                        if (isChartTrackBallBehavior)
                        {
                            AlignDefaultLabel(
                                ChartAlignment.Far,
                                ChartAlignment.Near,
                                ChartArea.SeriesClipRect.X + ChartArea.SeriesClipRect.Width,
                                (control.Content as ChartPointInfo).Y,
                                control);
                        }
                        else
                        {
                            AlignDefaultLabel(
                                verticalAlignemnt,
                                ChartAlignment.Near,
                                ChartArea.SeriesClipRect.X + ChartArea.SeriesClipRect.Width,
                                (control.Content as ChartPointInfo).Y,
                                control);
                        }

                        tipPosition   = (control.Content as ChartPointInfo).BaseX - (control.Content as ChartPointInfo).X;
                        leftTipWidth  = tipPosition - axisTipHypotenuse / 2;
                        rightTipWidth = tipPosition + axisTipHypotenuse / 2;

                        if (rightTipWidth > control.DesiredSize.Width)
                        {
                            rightTipWidth = control.DesiredSize.Width;
                        }
                        if (leftTipWidth < 0)
                        {
                            leftTipWidth = 0;
                        }

                        polygonPoints.Insert(2, (new Point(leftTipWidth, labelHeight)));
                        polygonPoints.Insert(3, (new Point(tipPosition, labelHeight + axisTipHeight)));
                        polygonPoints.Insert(4, (new Point(rightTipWidth, labelHeight)));
                    }
                    else
                    {
                        AlignDefaultLabel(verticalAlignemnt, horizontalAlignment, x, y, control);

                        polygonPoints.Insert(2, new Point(labelWidth / 2 - axisTipHypotenuse / 2, labelHeight));
                        polygonPoints.Insert(3, new Point(labelWidth / 2, labelHeight + axisTipHeight));
                        polygonPoints.Insert(4, new Point(labelWidth / 2 + axisTipHypotenuse / 2, labelHeight));
                    }
                }
                else
                {
                    double tipPosition, leftTipWidth, rightTipWidth;
                    if ((control.Content as ChartPointInfo).Axis.CrosshairLabelTemplate == null && !isChartTrackBallBehavior)
                    {
                        control.Margin = new Thickness(0, 6, 0, 0);
                    }

                    if (((control.Content as ChartPointInfo).X - control.DesiredSize.Height <= ChartArea.SeriesClipRect.X))
                    {
                        AlignDefaultLabel(
                            ChartAlignment.Far,
                            ChartAlignment.Far,
                            ChartArea.SeriesClipRect.X,
                            (control.Content as ChartPointInfo).Y,
                            control);

                        tipPosition   = (control.Content as ChartPointInfo).BaseX - ChartArea.SeriesClipRect.X;
                        leftTipWidth  = tipPosition - axisTipHypotenuse / 2;
                        rightTipWidth = tipPosition + axisTipHypotenuse / 2;

                        if (leftTipWidth < 0)
                        {
                            leftTipWidth = 0;
                        }

                        polygonPoints.Insert(4, (new Point(rightTipWidth, 0)));
                        polygonPoints.Insert(5, (new Point(tipPosition, -axisTipHeight)));
                        polygonPoints.Insert(6, (new Point(leftTipWidth, 0)));
                    }
                    else if ((control.Content as ChartPointInfo).X + control.DesiredSize.Width
                             >= ChartArea.SeriesClipRect.X + ChartArea.SeriesClipRect.Width)
                    {
                        AlignDefaultLabel(
                            ChartAlignment.Far,
                            ChartAlignment.Near,
                            ChartArea.SeriesClipRect.X + ChartArea.SeriesClipRect.Width,
                            (control.Content as ChartPointInfo).Y,
                            control);

                        tipPosition   = ((control.Content as ChartPointInfo).BaseX - (control.Content as ChartPointInfo).X);
                        leftTipWidth  = tipPosition - axisTipHypotenuse / 2;
                        rightTipWidth = tipPosition + axisTipHypotenuse / 2;

                        if (rightTipWidth > control.DesiredSize.Width)
                        {
                            rightTipWidth = control.DesiredSize.Width;
                        }
                        if (leftTipWidth < 0)
                        {
                            leftTipWidth = 0;
                        }

                        polygonPoints.Insert(4, new Point(rightTipWidth, 0));
                        polygonPoints.Insert(5, new Point(tipPosition, -axisTipHeight));
                        polygonPoints.Insert(6, new Point(leftTipWidth, 0));
                    }
                    else
                    {
                        AlignDefaultLabel(verticalAlignemnt, horizontalAlignment, x, y, control);

                        polygonPoints.Insert(4, new Point(labelWidth / 2 + axisTipHypotenuse / 2, 0));
                        polygonPoints.Insert(5, new Point(labelWidth / 2, -axisTipHeight));
                        polygonPoints.Insert(6, new Point(labelWidth / 2 - axisTipHypotenuse / 2, 0));
                    }
                }

                polygonPoints.Add(new Point(0, 0));
                (control.Content as ChartPointInfo).PolygonPoints = polygonPoints;
            }
            else
            {
                if (chartAxis.OpposedPosition)
                {
                    if ((control.Content as ChartPointInfo).Axis.CrosshairLabelTemplate == null && !isChartTrackBallBehavior)
                    {
                        control.Margin = new Thickness(6, 0, 0, 0);
                    }

                    if (((control.Content as ChartPointInfo).Y - control.DesiredSize.Height <= ChartArea.SeriesClipRect.Y))
                    {
                        if (isChartTrackBallBehavior)
                        {
                            AlignDefaultLabel(
                                ChartAlignment.Far,
                                ChartAlignment.Far,
                                (control.Content as ChartPointInfo).X,
                                ChartArea.SeriesClipRect.Y,
                                control);
                        }
                        else
                        {
                            AlignDefaultLabel(
                                ChartAlignment.Far,
                                horizontalAlignment,
                                (control.Content as ChartPointInfo).X,
                                ChartArea.SeriesClipRect.Y,
                                control);
                        }

                        double tipPosition   = (control.Content as ChartPointInfo).BaseY - ChartArea.SeriesClipRect.Y;
                        double lefttipWidth  = tipPosition - axisTipHypotenuse / 2;
                        double righttipWidth = tipPosition + axisTipHypotenuse / 2;

                        if (lefttipWidth < 0)
                        {
                            lefttipWidth = 0;
                        }
                        if (righttipWidth > labelHeight)
                        {
                            righttipWidth = labelHeight;
                        }

                        polygonPoints.Insert(1, new Point(0, lefttipWidth));
                        polygonPoints.Insert(2, new Point(-axisTipHeight, tipPosition));
                        polygonPoints.Insert(3, new Point(0, righttipWidth));
                    }
                    else if ((control.Content as ChartPointInfo).Y + control.DesiredSize.Height
                             >= ChartArea.SeriesClipRect.Y + ChartArea.SeriesClipRect.Height)
                    {
                        if (isChartTrackBallBehavior)
                        {
                            AlignDefaultLabel(
                                ChartAlignment.Near,
                                ChartAlignment.Far,
                                (control.Content as ChartPointInfo).X,
                                ChartArea.SeriesClipRect.Y + ChartArea.SeriesClipRect.Height,
                                control);
                        }
                        else
                        {
                            AlignDefaultLabel(
                                ChartAlignment.Near,
                                horizontalAlignment,
                                (control.Content as ChartPointInfo).X,
                                ChartArea.SeriesClipRect.Y + ChartArea.SeriesClipRect.Height,
                                control);
                        }

                        double tipPosition   = (control.Content as ChartPointInfo).BaseY - (control.Content as ChartPointInfo).Y;
                        double lefttipWidth  = tipPosition - axisTipHypotenuse / 2;
                        double righttipWidth = tipPosition + axisTipHypotenuse / 2;

                        if (righttipWidth > control.DesiredSize.Height)
                        {
                            righttipWidth = control.DesiredSize.Height;
                        }
                        if (lefttipWidth < 0)
                        {
                            lefttipWidth = 0;
                        }

                        polygonPoints.Insert(1, new Point(0, lefttipWidth));
                        polygonPoints.Insert(2, new Point(-axisTipHeight, tipPosition));
                        polygonPoints.Insert(3, new Point(0, righttipWidth));
                    }
                    else
                    {
                        if (!isChartTrackBallBehavior)
                        {
                            AlignDefaultLabel(verticalAlignemnt, horizontalAlignment, x, y, control);
                        }

                        polygonPoints.Insert(1, new Point(0, labelHeight / 3));
                        polygonPoints.Insert(2, new Point(-axisTipHeight, labelHeight / 2));
                        polygonPoints.Insert(3, new Point(0, labelHeight / 1.5));
                    }
                }
                else
                {
                    if ((control.Content as ChartPointInfo).Axis.CrosshairLabelTemplate == null && !isChartTrackBallBehavior)
                    {
                        control.Margin = new Thickness(-6, 0, 0, 0);
                    }

                    if (((control.Content as ChartPointInfo).Y - control.DesiredSize.Height <= ChartArea.SeriesClipRect.Y))
                    {
                        if (isChartTrackBallBehavior)
                        {
                            AlignDefaultLabel(
                                ChartAlignment.Far,
                                ChartAlignment.Far,
                                (control.Content as ChartPointInfo).X,
                                ChartArea.SeriesClipRect.Y,
                                control);
                        }
                        else
                        {
                            AlignDefaultLabel(
                                ChartAlignment.Far,
                                horizontalAlignment,
                                (control.Content as ChartPointInfo).X,
                                ChartArea.SeriesClipRect.Y,
                                control);
                        }

                        double tipPosition   = (control.Content as ChartPointInfo).BaseY - ChartArea.SeriesClipRect.Y;
                        double lefttipWidth  = tipPosition - axisTipHypotenuse / 2;
                        double righttipWidth = tipPosition + axisTipHypotenuse / 2;

                        if (lefttipWidth < 0)
                        {
                            lefttipWidth = 0;
                        }
                        if (righttipWidth > labelHeight)
                        {
                            righttipWidth = labelHeight;
                        }

                        polygonPoints.Insert(3, new Point(labelWidth, righttipWidth));
                        polygonPoints.Insert(4, new Point(labelWidth + axisTipHeight, tipPosition));
                        polygonPoints.Insert(5, new Point(labelWidth, lefttipWidth));
                    }
                    else if ((control.Content as ChartPointInfo).Y + control.DesiredSize.Height
                             >= ChartArea.SeriesClipRect.Y + ChartArea.SeriesClipRect.Height)
                    {
                        if (isChartTrackBallBehavior)
                        {
                            AlignDefaultLabel(
                                ChartAlignment.Near,
                                ChartAlignment.Far,
                                (control.Content as ChartPointInfo).X,
                                ChartArea.SeriesClipRect.Y + ChartArea.SeriesClipRect.Height,
                                control);
                        }
                        else
                        {
                            AlignDefaultLabel(
                                ChartAlignment.Near,
                                horizontalAlignment,
                                (control.Content as ChartPointInfo).X,
                                ChartArea.SeriesClipRect.Y + ChartArea.SeriesClipRect.Height,
                                control);
                        }

                        double tipPosition   = (control.Content as ChartPointInfo).BaseY - (control.Content as ChartPointInfo).Y;
                        double lefttipWidth  = tipPosition - axisTipHypotenuse / 2;
                        double righttipWidth = tipPosition + axisTipHypotenuse / 2;

                        if (lefttipWidth < 0)
                        {
                            lefttipWidth = 0;
                        }
                        if (righttipWidth > control.DesiredSize.Height)
                        {
                            righttipWidth = control.DesiredSize.Height;
                        }

                        polygonPoints.Add(new Point(labelWidth, righttipWidth));
                        polygonPoints.Add(new Point(labelWidth + axisTipHeight, tipPosition));
                        polygonPoints.Add(new Point(labelWidth, lefttipWidth));
                    }
                    else
                    {
                        if (!isChartTrackBallBehavior)
                        {
                            AlignDefaultLabel(verticalAlignemnt, horizontalAlignment, x, y, control);
                        }

                        polygonPoints.Add(new Point(labelWidth, labelHeight / 1.5));
                        polygonPoints.Add(new Point(labelWidth + axisTipHeight, labelHeight / 2));
                        polygonPoints.Add(new Point(labelWidth, labelHeight / 3));
                    }
                }

                polygonPoints.Add(new Point(labelWidth, 0));
                polygonPoints.Add(new Point(0, 0));

                (control.Content as ChartPointInfo).PolygonPoints = polygonPoints;
            }
        }