Example #1
0
        protected virtual void CreateTextMarkerGroup(Canvas gauge, double gaugeR)
        {
            ChartModel model = Model;
            Canvas     gElem = new Canvas();

            gauge.Children.Add(gElem);

            LookAndFeel lf = CurrentLookAndFeel;

            int    majorMarkerCount = YMajorGridCount;
            int    minorMarkerCount = YMinorGridCount;
            string majorMarkerXAML  = lf.GetGauageMarkerMajorXAML(),
                   minorMarkerXAML  = lf.GetGauageMarkerMinorXAML();
            string    textXAML      = lf.GetGauageTextXAML();
            TextBlock textElem;

            Canvas markerContainerCanvas = gauge.FindName("markerContainer") as Canvas;

            double markerContainerR = markerContainerCanvas.Width / 2;
            double minValue = model.MinYValue, maxValue = model.MaxYValue;

            double x, y, angle, textMargin = 0.0;

            double theta = Math.PI / 6;

            for (int i = 0;
                 i <= majorMarkerCount; ++i, theta += (5.0 * Math.PI / 3.0) / majorMarkerCount)
            {
                double adjustedTheta;

                if (theta < Math.PI / 2)
                {
                    adjustedTheta = theta + 3.0 * Math.PI / 2.0;
                }
                else
                {
                    adjustedTheta = theta - Math.PI / 2.0;
                }

                x = gaugeR - markerContainerR * (Math.Cos(adjustedTheta));
                y = gaugeR - markerContainerR * (Math.Sin(adjustedTheta));

                angle = adjustedTheta * 180 / Math.PI;

                Path marker = XamlReader.Load(majorMarkerXAML) as Path;

                TransformGroup     tg = new TransformGroup();
                TranslateTransform tt = new TranslateTransform();
                RotateTransform    rt = new RotateTransform();

                tt.X     = x;
                tt.Y     = y;
                rt.Angle = angle;
                tg.Children.Add(rt);
                tg.Children.Add(tt);
                marker.RenderTransform = tg;
                gElem.Children.Add(marker);

                double value = minValue + i * (maxValue - minValue) / (majorMarkerCount);
                textElem      = XamlReader.Load(textXAML) as TextBlock;
                textElem.Text = value.ToString(Format);

                if (i == 0)
                {
                    textMargin = textElem.ActualHeight / 2;
                }

                x = gaugeR - (markerContainerR - textMargin) * (Math.Cos(adjustedTheta));
                y = gaugeR - (markerContainerR - textMargin) * (Math.Sin(adjustedTheta));

                if (theta >= 5 * Math.PI / 6 && theta <= 7 * Math.PI / 6)
                {
                    x -= textElem.ActualWidth / 2;
                }
                else
                {
                    y -= textElem.ActualHeight / 2;

                    if (theta < Math.PI)
                    {
                        x += 2 * _TEXT_MARGIN;
                    }
                    else
                    {
                        x -= textElem.ActualWidth + 2 * _TEXT_MARGIN;
                    }
                }

                tt   = new TranslateTransform();
                tt.X = x;
                tt.Y = y;

                textElem.RenderTransform = tt;
                gElem.Children.Add(textElem);
            }

            theta = Math.PI / 6 + (5 * Math.PI / 3) / (majorMarkerCount * minorMarkerCount);
            for (int i = (minorMarkerCount + 1);
                 i <= (majorMarkerCount + 1) * minorMarkerCount;
                 ++i, theta += (5 * Math.PI / 3) / (majorMarkerCount * minorMarkerCount))
            {
                if (i % minorMarkerCount == 0)
                {
                    continue;
                }

                double adjustedTheta;
                if (theta < Math.PI / 2)
                {
                    adjustedTheta = theta + 3 * Math.PI / 2;
                }
                else
                {
                    adjustedTheta = theta - Math.PI / 2;
                }

                x     = gaugeR - markerContainerR * (Math.Cos(adjustedTheta));
                y     = gaugeR - markerContainerR * (Math.Sin(adjustedTheta));
                angle = adjustedTheta * 180 / Math.PI;

                Path               marker = XamlReader.Load(minorMarkerXAML) as Path;
                TransformGroup     tg     = new TransformGroup();
                TranslateTransform tt     = new TranslateTransform();
                RotateTransform    rt     = new RotateTransform();

                tt.X     = x;
                tt.Y     = y;
                rt.Angle = angle;
                tg.Children.Add(rt);
                tg.Children.Add(tt);
                marker.RenderTransform = tg;
                gElem.Children.Add(marker);
            }
        }