示例#1
0
        internal void UpdateUI()
        {
            if (range.IsEmpty)
            {
                return;
            }

            if (transform == null)
            {
                return;
            }

            if (independent)
            {
                InitTransform(RenderSize);
            }

            bool isHorizontal = Placement == AxisPlacement.Bottom || Placement == AxisPlacement.Top;

            if (transform.ScreenRect.Width == 0 && isHorizontal ||
                transform.ScreenRect.Height == 0 && !isHorizontal)
            {
                return;
            }

            if (!IsMeasureValid)
            {
                InvalidateMeasure();
            }

            CreateTicks();

            // removing unfinite screen ticks
            var tempTicks       = new List <T>(ticks);
            var tempScreenTicks = new List <double>(ticks.Length);
            var tempLabels      = new List <UIElement>(labels);

            int i = 0;

            while (i < tempTicks.Count)
            {
                T      tick       = tempTicks[i];
                double screenTick = getCoordinate(createDataPoint(convertToDouble(tick)).DataToScreen(transform));
                if (screenTick.IsFinite())
                {
                    tempScreenTicks.Add(screenTick);
                    i++;
                }
                else
                {
                    tempTicks.RemoveAt(i);
                    tempLabels.RemoveAt(i);
                }
            }

            ticks       = tempTicks.ToArray();
            screenTicks = tempScreenTicks.ToArray();
            labels      = tempLabels.ToArray();

            // saving generated lines into pool
            for (i = 0; i < geomGroup.Children.Count; i++)
            {
                var geometry = (LineGeometry)geomGroup.Children[i];
                lineGeomPool.Put(geometry);
            }

            geomGroup          = new GeometryGroup();
            geomGroup.Children = new GeometryCollection(lineGeomPool.Count);

            if (drawTicks)
            {
                DoDrawTicks(screenTicks, geomGroup.Children);
            }

            if (drawMinorTicks)
            {
                DoDrawMinorTicks(geomGroup.Children);
            }

            ticksPath.Data = geomGroup;

            DoDrawCommonLabels(screenTicks);

            if (drawMajorLabels)
            {
                DoDrawMajorLabels();
            }

            ScreenTicksChanged.Raise(this);
        }
示例#2
0
        private void UpdateUIRepresentation()
        {
            if (range.IsEmpty)
            {
                return;
            }

            if (transform == null)
            {
                return;
            }

            if (independent)
            {
                InitTransform(RenderSize);
            }

            bool isHorizontal = Placement == AxisPlacement.Bottom || Placement == AxisPlacement.Top;

            if (transform.ScreenRect.Width == 0 && isHorizontal ||
                transform.ScreenRect.Height == 0 && !isHorizontal)
            {
                return;
            }

            if (!IsMeasureValid)
            {
                InvalidateMeasure();
                return;
            }

            CreateTicks();

            // removing unfinite screen ticks
            var tempTicks       = new List <T>(ticks);
            var tempScreenTicks = new List <double>(ticks.Length);
            var tempLabels      = new List <UIElement>(labels);

            int i = 0;

            while (i < tempTicks.Count)
            {
                T      tick       = tempTicks[i];
                double screenTick = getCoordinate(createDataPoint(convertToDouble(tick)).DataToScreen(transform));
                if (screenTick.IsFinite())
                {
                    tempScreenTicks.Add(screenTick);
                    i++;
                }
                else
                {
                    tempTicks.RemoveAt(i);
                    tempLabels.RemoveAt(i);
                }
            }

            ticks       = tempTicks.ToArray();
            screenTicks = tempScreenTicks.ToArray();
            labels      = tempLabels.ToArray();

            GeometryGroup geomGroup = new GeometryGroup();

            DrawTicks(screenTicks, geomGroup);

            if (showMinorTicks)
            {
                DoDrawMinorTicks(geomGroup);
            }

            ticksPath.Data = geomGroup;

            CreateCommonLabels(screenTicks);

            if (showMayorLabels)
            {
                DoDrawMayorLabels();
            }

            ScreenTicksChanged.Raise(this);
        }
示例#3
0
        internal void UpdateUI()
        {
            if (range.IsEmpty)
            {
                return;
            }

            if (transform == null)
            {
                return;
            }

            if (independent)
            {
                InitTransform(RenderSize);
            }

            bool isHorizontal = Placement == AxisPlacement.Bottom || Placement == AxisPlacement.Top;

            if (transform.ScreenRect.Width == 0 && isHorizontal ||
                transform.ScreenRect.Height == 0 && !isHorizontal)
            {
                return;
            }

            if (!IsMeasureValid)
            {
                InvalidateMeasure();
            }

            Range <double> currentDoubleRange = new Range <double>(convertToDouble(range.Min), convertToDouble(range.Max));
            bool           sameLength         = Math.Abs(cachedPartLength - currentDoubleRange.GetLength()) / cachedPartLength < 0.01 || cachedPartLength == 0;

            if (UseSmoothPanning && sameLength)
            {
                Debug.WriteLine(Placement + " " + range + " " + axisLongRange);
                // current range is included into axisLongRange
                if (currentDoubleRange < axisLongRange)
                {
                    var    axisContent = (FrameworkElement)mainGrid.Children[0];
                    double leftScreen;
                    if (placement.IsBottomOrTop())
                    {
                        leftScreen = ((axisLongRange.Min - currentDoubleRange.Min) / currentDoubleRange.GetLength() + 1) * getSize(transform.ScreenRect.Size);
                    }
                    else
                    {
                        leftScreen = -((axisLongRange.Min - currentDoubleRange.Min) / currentDoubleRange.GetLength() + 1) * getSize(transform.ScreenRect.Size);
                    }

                    StackCanvas.SetCoordinate(axisContent, leftScreen);

                    // this call should be commented
                    // double rightScreen = ((axisLongRange.Max - currentDoubleRange.Max) / currentDoubleRange.GetLength() + 1) * getSize(transform.ScreenRect.Size);
                    // StackCanvas.SetEndCoordinate(axisContent, rightScreen);
                }
                else
                {
                    double length = currentDoubleRange.GetLength();
                    cachedPartLength = length;

                    // cached axis part is three times longer
                    double    min        = currentDoubleRange.Min - length;
                    double    max        = currentDoubleRange.Max + length;
                    Range <T> widerRange = new Range <T>(convertFromDouble(min), convertFromDouble(max));
                    axisLongRange = new Range <double>(min, max);

                    // rebuild entire ticks
                    FillParts(widerRange);

                    Debug.WriteLine("не шире " + Placement + " " + widerRange);

                    originalScreenTicks = screenTicks.ToArray();
                }

                // updating screen ticks (for axis grid)
                // 3 is a ratio of cached area to visible area
                double shift = (currentDoubleRange.Min - (axisLongRange.Min + axisLongRange.GetLength() / 3)) * getSize(transform.ScreenRect.Size);

                if (!placement.IsBottomOrTop())
                {
                    shift *= -1;
                }

                screenTicks = originalScreenTicks.ToArray();
                for (int i = 0; i < originalScreenTicks.Length; i++)
                {
                    screenTicks[i] -= shift;
                }
            }
            else
            {
                FillParts(range);
            }

            ScreenTicksChanged.Raise(this);
        }