From d4a8b98b37b71f25fd41d14fd351bee5ddb1a89a Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 9 Dec 2022 15:43:19 +0100 Subject: [PATCH] Invalidate measure less. Only invalidate the measure when the viewport changes in the direction of scroll. --- src/Avalonia.Controls/VirtualizingStackPanel.cs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Controls/VirtualizingStackPanel.cs b/src/Avalonia.Controls/VirtualizingStackPanel.cs index 8f42372179..7e5a00e6f7 100644 --- a/src/Avalonia.Controls/VirtualizingStackPanel.cs +++ b/src/Avalonia.Controls/VirtualizingStackPanel.cs @@ -528,9 +528,21 @@ namespace Avalonia.Controls private void OnEffectiveViewportChanged(object? sender, EffectiveViewportChangedEventArgs e) { + var vertical = Orientation == Orientation.Vertical; + var oldViewportStart = vertical ? _viewport.Top : _viewport.Left; + var oldViewportEnd = vertical ? _viewport.Bottom : _viewport.Right; + _viewport = e.EffectiveViewport; _isWaitingForViewportUpdate = false; - InvalidateMeasure(); + + var newViewportStart = vertical ? _viewport.Top : _viewport.Left; + var newViewportEnd = vertical ? _viewport.Bottom : _viewport.Right; + + if (!MathUtilities.AreClose(oldViewportStart, newViewportStart) || + !MathUtilities.AreClose(oldViewportEnd, newViewportEnd)) + { + InvalidateMeasure(); + } } private static void InvalidateHack(Control c)