Browse Source

Fix changing virtualization mode in theory.

That is; tests pass. In practise in the virtualization test app it still
doesn't quite work.
Steven Kirk 9 years ago
parent
commit
32760bbc08

+ 2 - 0
src/Avalonia.Controls/Presenters/ItemVirtualizer.cs

@@ -25,6 +25,8 @@ namespace Avalonia.Controls.Presenters
         public ItemVirtualizer(ItemsPresenter owner)
         {
             Owner = owner;
+            Items = owner.Items;
+            ItemCount = owner.Items.Count();
         }
 
         /// <summary>

+ 4 - 0
src/Avalonia.Controls/Presenters/ItemVirtualizerNone.cs

@@ -19,6 +19,10 @@ namespace Avalonia.Controls.Presenters
         public ItemVirtualizerNone(ItemsPresenter owner)
             : base(owner)
         {
+            if (Items != null && owner.Panel != null)
+            {
+                AddContainers(0, Items);
+            }
         }
 
         /// <inheritdoc/>

+ 4 - 0
src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs

@@ -23,6 +23,10 @@ namespace Avalonia.Controls.Presenters
         public ItemVirtualizerSimple(ItemsPresenter owner)
             : base(owner)
         {
+            if (Items != null && VirtualizingPanel != null)
+            {
+                CreateAndRemoveContainers();
+            }
         }
 
         /// <inheritdoc/>

+ 0 - 8
src/Avalonia.Controls/Presenters/ItemsPresenter.cs

@@ -121,14 +121,6 @@ namespace Avalonia.Controls.Presenters
         {
             _virtualizer?.Dispose();
             _virtualizer = ItemVirtualizer.Create(this);
-
-            if (Items != null && Panel != null)
-            {
-                _virtualizer.ItemsChanged(
-                    Items,
-                    new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
-            }
-
             ((ILogicalScrollable)this).InvalidateScroll?.Invoke();
         }
     }

+ 2 - 1
src/Avalonia.Controls/Presenters/ScrollContentPresenter.cs

@@ -290,8 +290,9 @@ namespace Avalonia.Controls.Presenters
                 if (!scrollable.IsLogicalScrollEnabled)
                 {
                     Offset = default(Vector);
-                    InvalidateMeasure();
                 }
+
+                InvalidateMeasure();
             }
 
             if (scrollable.IsLogicalScrollEnabled)

+ 28 - 3
tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization.cs

@@ -153,7 +153,30 @@ namespace Avalonia.Controls.UnitTests.Presenters
         }
 
         [Fact]
-        public void Changing_VirtualizationMode_Simple_To_None_Should_Update_Scroll_Properties()
+        public void Changing_VirtualizationMode_None_To_Simple_Should_Update_Control()
+        {
+            var target = CreateTarget(mode: ItemVirtualizationMode.None);
+            var scroll = (ScrollContentPresenter)target.Parent;
+
+            target.ApplyTemplate();
+            scroll.Measure(new Size(100, 100));
+            scroll.Arrange(new Rect(0, 0, 100, 100));
+
+            Assert.Equal(20, target.Panel.Children.Count);
+            Assert.Equal(new Size(10, 200), scroll.Extent);
+            Assert.Equal(new Size(100, 100), scroll.Viewport);
+
+            target.VirtualizationMode = ItemVirtualizationMode.Simple;
+            scroll.Measure(new Size(100, 100));
+            scroll.Arrange(new Rect(0, 0, 100, 100));
+
+            Assert.Equal(10, target.Panel.Children.Count);
+            Assert.Equal(new Size(0, 20), scroll.Extent);
+            Assert.Equal(new Size(0, 10), scroll.Viewport);
+        }
+
+        [Fact]
+        public void Changing_VirtualizationMode_Simple_To_None_Should_Update_Control()
         {
             var target = CreateTarget();
 
@@ -167,10 +190,12 @@ namespace Avalonia.Controls.UnitTests.Presenters
             Assert.Equal(new Size(0, 10), scroll.Viewport);
 
             target.VirtualizationMode = ItemVirtualizationMode.None;
+            scroll.Measure(new Size(100, 100));
+            scroll.Arrange(new Rect(0, 0, 100, 100));
 
             Assert.Equal(20, target.Panel.Children.Count);
-            Assert.Equal(new Size(0, 200), scroll.Extent);
-            Assert.Equal(new Size(0, 100), scroll.Viewport);
+            Assert.Equal(new Size(10, 200), scroll.Extent);
+            Assert.Equal(new Size(100, 100), scroll.Viewport);
         }
 
         private static ItemsPresenter CreateTarget(