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.
pull/545/head
Steven Kirk 10 years ago
parent
commit
32760bbc08
  1. 2
      src/Avalonia.Controls/Presenters/ItemVirtualizer.cs
  2. 4
      src/Avalonia.Controls/Presenters/ItemVirtualizerNone.cs
  3. 4
      src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs
  4. 8
      src/Avalonia.Controls/Presenters/ItemsPresenter.cs
  5. 3
      src/Avalonia.Controls/Presenters/ScrollContentPresenter.cs
  6. 31
      tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization.cs

2
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
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
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/>

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

3
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)

31
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(

Loading…
Cancel
Save