private void SetVerticalOffset(double physicalOffset, bool updateUI, bool updateScrollViewer) { var adjustedOffset = GridModel.DoubleArithmetics.Ceiling(physicalOffset); bool needUpdate = !LayoutDoubleUtil.AreClose(this.lastScrollOffset.Y, physicalOffset) || physicalOffset < 0; this.lastScrollOffset.Y = adjustedOffset; if (needUpdate) { if (updateUI && this.CellsPanel != null) { if ((this.model.pendingMeasureFlags & InvalidateMeasureFlags.Header) == InvalidateMeasureFlags.Header && this.columnHeadersPanel != null) { this.columnHeadersPanel.Measure(); this.columnHeadersPanel.Arrange(); } this.CellsPanel.Measure(); this.CellsPanel.Arrange(); } if (updateScrollViewer) { this.ScrollViewer.ChangeView(null, adjustedOffset, null, true); ////Ensure that scrollviewer has updated its position. if (updateUI) { this.ScrollViewer.UpdateLayout(); } } } }
private void SetHorizontalOffset(double physicalOffset, bool updateUI, bool updateScrollViewer) { var adjustedOffset = GridModel.DoubleArithmetics.Ceiling(physicalOffset); bool needUpdate = !LayoutDoubleUtil.AreClose(this.lastScrollOffset.X, physicalOffset) || physicalOffset < 0; this.lastScrollOffset.X = adjustedOffset; if (needUpdate) { // TODO: The updateUI flag should be removed and all the needed updates should be processed by the UpdateService if (updateUI) { if (this.columnHeadersPanel != null) { this.columnHeadersPanel.Measure(); this.columnHeadersPanel.Arrange(); } if (this.CellsPanel != null) { this.CellsPanel.Measure(); this.CellsPanel.Arrange(); } } if (updateScrollViewer) { this.ScrollViewer.ChangeView(adjustedOffset, null, null, true); // Ensure that scrollviewer has updated its position. if (updateUI) { this.ScrollViewer.UpdateLayout(); } } } }