protected internal virtual void AlignDefaultLabel( ChartAlignment verticalAlignemnt, ChartAlignment horizontalAlignment, double x, double y, ContentControl control) { }
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; } }