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); }
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); }
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); }