From 7a718ef9c29f19ab0aa39b59a075c6e913c06bb4 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Wed, 8 Jun 2016 23:54:17 +0200 Subject: [PATCH] Updated overflow algorithm. --- .../VirtualizingStackPanel.cs | 3 +- .../VirtualizingStackPanelTests.cs | 46 +++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Controls/VirtualizingStackPanel.cs b/src/Avalonia.Controls/VirtualizingStackPanel.cs index e4f639bdcb..9b2e1ffe21 100644 --- a/src/Avalonia.Controls/VirtualizingStackPanel.cs +++ b/src/Avalonia.Controls/VirtualizingStackPanel.cs @@ -41,7 +41,7 @@ namespace Avalonia.Controls { var bounds = Orientation == Orientation.Horizontal ? Bounds.Width : Bounds.Height; - return Math.Max(0, (_takenSpace - _pixelOffset) - bounds); + return Math.Max(0, _takenSpace - bounds); } } @@ -82,6 +82,7 @@ namespace Avalonia.Controls _averageItemSize = 0; _averageCount = 0; var result = base.ArrangeOverride(finalSize); + _takenSpace += _pixelOffset; Controller?.UpdateControls(); return result; } diff --git a/tests/Avalonia.Controls.UnitTests/VirtualizingStackPanelTests.cs b/tests/Avalonia.Controls.UnitTests/VirtualizingStackPanelTests.cs index 9034076444..a024fb5ec5 100644 --- a/tests/Avalonia.Controls.UnitTests/VirtualizingStackPanelTests.cs +++ b/tests/Avalonia.Controls.UnitTests/VirtualizingStackPanelTests.cs @@ -80,6 +80,52 @@ namespace Avalonia.Controls.UnitTests Assert.Equal(2, target.OverflowCount); } + [Fact] + public void Reports_PixelOverflow_After_Arrange() + { + var target = (IVirtualizingPanel)new VirtualizingStackPanel(); + + target.Children.Add(new Canvas { Width = 50, Height = 50 }); + target.Children.Add(new Canvas { Width = 50, Height = 52 }); + + target.Measure(new Size(100, 100)); + target.Arrange(new Rect(target.DesiredSize)); + + Assert.Equal(2, target.PixelOverflow); + } + + [Fact] + public void Reports_PixelOverflow_With_PixelOffset() + { + var target = (IVirtualizingPanel)new VirtualizingStackPanel(); + + target.Children.Add(new Canvas { Width = 50, Height = 50 }); + target.Children.Add(new Canvas { Width = 50, Height = 52 }); + target.PixelOffset = 2; + + target.Measure(new Size(100, 100)); + target.Arrange(new Rect(target.DesiredSize)); + + Assert.Equal(2, target.PixelOverflow); + } + + [Fact] + public void PixelOffset_Can_Be_More_Than_Child_Without_Affecting_IsFull() + { + var target = (IVirtualizingPanel)new VirtualizingStackPanel(); + + target.Children.Add(new Canvas { Width = 50, Height = 50 }); + target.Children.Add(new Canvas { Width = 50, Height = 52 }); + target.PixelOffset = 55; + + target.Measure(new Size(100, 100)); + target.Arrange(new Rect(target.DesiredSize)); + + Assert.Equal(55, target.PixelOffset); + Assert.Equal(2, target.PixelOverflow); + Assert.True(target.IsFull); + } + [Fact] public void Passes_Navigation_Request_To_ILogicalScrollable_Parent() {