|
|
|
@ -15,6 +15,7 @@ using Avalonia.Input; |
|
|
|
using Avalonia.Layout; |
|
|
|
using Avalonia.Platform; |
|
|
|
using Avalonia.Rendering; |
|
|
|
using Avalonia.Styling; |
|
|
|
using Avalonia.UnitTests; |
|
|
|
using Xunit; |
|
|
|
|
|
|
|
@ -756,6 +757,80 @@ namespace Avalonia.Controls.UnitTests.Presenters |
|
|
|
Assert.Same(target.Panel.Children[9].DataContext, last); |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void Scrolling_Less_Than_A_Page_Should_Move_Recycled_Items() |
|
|
|
{ |
|
|
|
var target = CreateTarget(); |
|
|
|
var items = (IList<string>)target.Items; |
|
|
|
|
|
|
|
target.ApplyTemplate(); |
|
|
|
target.Measure(new Size(100, 100)); |
|
|
|
target.Arrange(new Rect(0, 0, 100, 100)); |
|
|
|
|
|
|
|
var containers = target.Panel.Children.ToList(); |
|
|
|
var scroller = (ScrollContentPresenter)target.Parent; |
|
|
|
|
|
|
|
scroller.Offset = new Vector(0, 5); |
|
|
|
|
|
|
|
var scrolledContainers = containers |
|
|
|
.Skip(5) |
|
|
|
.Take(5) |
|
|
|
.Concat(containers.Take(5)).ToList(); |
|
|
|
|
|
|
|
Assert.Equal(new Vector(0, 5), ((ILogicalScrollable)target).Offset); |
|
|
|
Assert.Equal(scrolledContainers, target.Panel.Children); |
|
|
|
|
|
|
|
for (var i = 0; i < target.Panel.Children.Count; ++i) |
|
|
|
{ |
|
|
|
Assert.Equal(items[i + 5], target.Panel.Children[i].DataContext); |
|
|
|
} |
|
|
|
|
|
|
|
scroller.Offset = new Vector(0, 0); |
|
|
|
Assert.Equal(new Vector(0, 0), ((ILogicalScrollable)target).Offset); |
|
|
|
Assert.Equal(containers, target.Panel.Children); |
|
|
|
|
|
|
|
var dcs = target.Panel.Children.Select(x => x.DataContext).ToList(); |
|
|
|
|
|
|
|
for (var i = 0; i < target.Panel.Children.Count; ++i) |
|
|
|
{ |
|
|
|
Assert.Equal(items[i], target.Panel.Children[i].DataContext); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void Scrolling_More_Than_A_Page_Should_Recycle_Items() |
|
|
|
{ |
|
|
|
var target = CreateTarget(itemCount: 50); |
|
|
|
var items = (IList<string>)target.Items; |
|
|
|
|
|
|
|
target.ApplyTemplate(); |
|
|
|
target.Measure(new Size(100, 100)); |
|
|
|
target.Arrange(new Rect(0, 0, 100, 100)); |
|
|
|
|
|
|
|
var containers = target.Panel.Children.ToList(); |
|
|
|
var scroller = (ScrollContentPresenter)target.Parent; |
|
|
|
|
|
|
|
scroller.Offset = new Vector(0, 20); |
|
|
|
|
|
|
|
Assert.Equal(new Vector(0, 20), ((ILogicalScrollable)target).Offset); |
|
|
|
Assert.Equal(containers, target.Panel.Children); |
|
|
|
|
|
|
|
for (var i = 0; i < target.Panel.Children.Count; ++i) |
|
|
|
{ |
|
|
|
Assert.Equal(items[i + 20], target.Panel.Children[i].DataContext); |
|
|
|
} |
|
|
|
|
|
|
|
scroller.Offset = new Vector(0, 0); |
|
|
|
|
|
|
|
Assert.Equal(new Vector(0, 0), ((ILogicalScrollable)target).Offset); |
|
|
|
Assert.Equal(containers, target.Panel.Children); |
|
|
|
|
|
|
|
for (var i = 0; i < target.Panel.Children.Count; ++i) |
|
|
|
{ |
|
|
|
Assert.Equal(items[i], target.Panel.Children[i].DataContext); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public class Vertical |
|
|
|
{ |
|
|
|
[Fact] |
|
|
|
@ -941,86 +1016,8 @@ namespace Avalonia.Controls.UnitTests.Presenters |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public class WithContainers |
|
|
|
{ |
|
|
|
[Fact] |
|
|
|
public void Scrolling_Less_Than_A_Page_Should_Move_Recycled_Items() |
|
|
|
{ |
|
|
|
var target = CreateTarget(); |
|
|
|
var items = (IList<string>)target.Items; |
|
|
|
|
|
|
|
target.ApplyTemplate(); |
|
|
|
target.Measure(new Size(100, 100)); |
|
|
|
target.Arrange(new Rect(0, 0, 100, 100)); |
|
|
|
|
|
|
|
var containers = target.Panel.Children.ToList(); |
|
|
|
var scroller = (ScrollContentPresenter)target.Parent; |
|
|
|
|
|
|
|
scroller.Offset = new Vector(0, 5); |
|
|
|
|
|
|
|
var scrolledContainers = containers |
|
|
|
.Skip(5) |
|
|
|
.Take(5) |
|
|
|
.Concat(containers.Take(5)).ToList(); |
|
|
|
|
|
|
|
Assert.Equal(new Vector(0, 5), ((ILogicalScrollable)target).Offset); |
|
|
|
Assert.Equal(scrolledContainers, target.Panel.Children); |
|
|
|
|
|
|
|
for (var i = 0; i < target.Panel.Children.Count; ++i) |
|
|
|
{ |
|
|
|
Assert.Equal(items[i + 5], target.Panel.Children[i].DataContext); |
|
|
|
} |
|
|
|
|
|
|
|
scroller.Offset = new Vector(0, 0); |
|
|
|
Assert.Equal(new Vector(0, 0), ((ILogicalScrollable)target).Offset); |
|
|
|
Assert.Equal(containers, target.Panel.Children); |
|
|
|
|
|
|
|
var dcs = target.Panel.Children.Select(x => x.DataContext).ToList(); |
|
|
|
|
|
|
|
for (var i = 0; i < target.Panel.Children.Count; ++i) |
|
|
|
{ |
|
|
|
Assert.Equal(items[i], target.Panel.Children[i].DataContext); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void Scrolling_More_Than_A_Page_Should_Recycle_Items() |
|
|
|
{ |
|
|
|
var target = CreateTarget(itemCount: 50); |
|
|
|
var items = (IList<string>)target.Items; |
|
|
|
|
|
|
|
target.ApplyTemplate(); |
|
|
|
target.Measure(new Size(100, 100)); |
|
|
|
target.Arrange(new Rect(0, 0, 100, 100)); |
|
|
|
|
|
|
|
var containers = target.Panel.Children.ToList(); |
|
|
|
var scroller = (ScrollContentPresenter)target.Parent; |
|
|
|
|
|
|
|
scroller.Offset = new Vector(0, 20); |
|
|
|
|
|
|
|
Assert.Equal(new Vector(0, 20), ((ILogicalScrollable)target).Offset); |
|
|
|
Assert.Equal(containers, target.Panel.Children); |
|
|
|
|
|
|
|
for (var i = 0; i < target.Panel.Children.Count; ++i) |
|
|
|
{ |
|
|
|
Assert.Equal(items[i + 20], target.Panel.Children[i].DataContext); |
|
|
|
} |
|
|
|
|
|
|
|
scroller.Offset = new Vector(0, 0); |
|
|
|
|
|
|
|
Assert.Equal(new Vector(0, 0), ((ILogicalScrollable)target).Offset); |
|
|
|
Assert.Equal(containers, target.Panel.Children); |
|
|
|
|
|
|
|
for (var i = 0; i < target.Panel.Children.Count; ++i) |
|
|
|
{ |
|
|
|
Assert.Equal(items[i], target.Panel.Children[i].DataContext); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private static ItemsPresenter CreateTarget( |
|
|
|
Orientation orientation = Orientation.Vertical, |
|
|
|
bool useContainers = true, |
|
|
|
int itemCount = 20, |
|
|
|
bool useAvaloniaList = false) |
|
|
|
{ |
|
|
|
@ -1034,11 +1031,11 @@ namespace Avalonia.Controls.UnitTests.Presenters |
|
|
|
{ |
|
|
|
CanHorizontallyScroll = true, |
|
|
|
CanVerticallyScroll = true, |
|
|
|
Content = result = new TestItemsPresenter(useContainers) |
|
|
|
Content = result = new TestItemsPresenter |
|
|
|
{ |
|
|
|
Items = items, |
|
|
|
ItemsPanel = VirtualizingPanelTemplate(orientation), |
|
|
|
ItemTemplate = ItemTemplate(), |
|
|
|
DataTemplates = { StringDataTemplate() }, |
|
|
|
VirtualizationMode = ItemVirtualizationMode.Simple, |
|
|
|
} |
|
|
|
}; |
|
|
|
@ -1047,7 +1044,7 @@ namespace Avalonia.Controls.UnitTests.Presenters |
|
|
|
return result; |
|
|
|
} |
|
|
|
|
|
|
|
private static IDataTemplate ItemTemplate() |
|
|
|
private static IDataTemplate StringDataTemplate() |
|
|
|
{ |
|
|
|
return new FuncDataTemplate<string>(x => new Canvas |
|
|
|
{ |
|
|
|
@ -1065,7 +1062,7 @@ namespace Avalonia.Controls.UnitTests.Presenters |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
private class TestScroller : ScrollContentPresenter, IRenderRoot, ILayoutRoot |
|
|
|
private class TestScroller : ScrollContentPresenter, IRenderRoot, ILayoutRoot, IStyleRoot |
|
|
|
{ |
|
|
|
public IRenderer Renderer { get; } |
|
|
|
public Size ClientSize { get; } |
|
|
|
@ -1085,18 +1082,12 @@ namespace Avalonia.Controls.UnitTests.Presenters |
|
|
|
|
|
|
|
private class TestItemsPresenter : ItemsPresenter |
|
|
|
{ |
|
|
|
private bool _useContainers; |
|
|
|
|
|
|
|
public TestItemsPresenter(bool useContainers) |
|
|
|
{ |
|
|
|
_useContainers = useContainers; |
|
|
|
} |
|
|
|
|
|
|
|
protected override IItemContainerGenerator CreateItemContainerGenerator() |
|
|
|
{ |
|
|
|
return _useContainers ? |
|
|
|
new ItemContainerGenerator<TestContainer>(this, TestContainer.ContentProperty, null) : |
|
|
|
new ItemContainerGenerator(this); |
|
|
|
return new ItemContainerGenerator<TestContainer>( |
|
|
|
this, |
|
|
|
TestContainer.ContentProperty, |
|
|
|
null); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -1104,8 +1095,12 @@ namespace Avalonia.Controls.UnitTests.Presenters |
|
|
|
{ |
|
|
|
public TestContainer() |
|
|
|
{ |
|
|
|
Width = 10; |
|
|
|
Height = 10; |
|
|
|
Template = new FuncControlTemplate<TestContainer>(parent => new ContentPresenter |
|
|
|
{ |
|
|
|
Name = "PART_ContentPresenter", |
|
|
|
[~ContentPresenter.ContentProperty] = parent[~ContentControl.ContentProperty], |
|
|
|
[~ContentPresenter.ContentTemplateProperty] = parent[~ContentControl.ContentTemplateProperty], |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|