|
|
|
@ -1,16 +1,17 @@ |
|
|
|
// Copyright (c) The Avalonia Project. All rights reserved.
|
|
|
|
// Licensed under the MIT license. See licence.md file in the project root for full license information.
|
|
|
|
|
|
|
|
using System; |
|
|
|
using System.Collections.ObjectModel; |
|
|
|
using System.Linq; |
|
|
|
using Avalonia.Controls.Presenters; |
|
|
|
using Avalonia.Controls.Templates; |
|
|
|
using Avalonia.Input; |
|
|
|
using Avalonia.Data; |
|
|
|
using Avalonia.LogicalTree; |
|
|
|
using Avalonia.Styling; |
|
|
|
using Avalonia.UnitTests; |
|
|
|
using Avalonia.VisualTree; |
|
|
|
using Xunit; |
|
|
|
using Avalonia.Collections; |
|
|
|
|
|
|
|
namespace Avalonia.Controls.UnitTests |
|
|
|
{ |
|
|
|
@ -170,6 +171,109 @@ namespace Avalonia.Controls.UnitTests |
|
|
|
Assert.Equal(new Size(100, 10), target.Scroll.Viewport); |
|
|
|
} |
|
|
|
|
|
|
|
[Theory] |
|
|
|
[InlineData(ItemVirtualizationMode.Simple)] |
|
|
|
[InlineData(ItemVirtualizationMode.None)] |
|
|
|
public void When_Added_Removed_AfterItems_Reset_Should_Work(ItemVirtualizationMode virtMode) |
|
|
|
{ |
|
|
|
using (UnitTestApplication.Start(TestServices.StyledWindow)) |
|
|
|
{ |
|
|
|
var items = new ObservableCollection<string>(); |
|
|
|
|
|
|
|
Action create = () => |
|
|
|
{ |
|
|
|
foreach (var i in Enumerable.Range(1, 7)) |
|
|
|
{ |
|
|
|
items.Add(i.ToString()); |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
create(); |
|
|
|
|
|
|
|
var wnd = new Window() { SizeToContent = SizeToContent.WidthAndHeight }; |
|
|
|
|
|
|
|
wnd.IsVisible = true; |
|
|
|
|
|
|
|
var target = new ListBox() { VirtualizationMode = virtMode }; |
|
|
|
|
|
|
|
wnd.Content = target; |
|
|
|
|
|
|
|
var lm = wnd.LayoutManager; |
|
|
|
|
|
|
|
target.Height = 110;//working fine when <=106 or >=119
|
|
|
|
target.Width = 50; |
|
|
|
|
|
|
|
target.ItemTemplate = new FuncDataTemplate<object>(c => |
|
|
|
{ |
|
|
|
var tb = new TextBlock() { Height = 10, Width = 30 }; |
|
|
|
tb.Bind(TextBlock.TextProperty, new Binding()); |
|
|
|
return tb; |
|
|
|
}, true); |
|
|
|
|
|
|
|
target.DataContext = items; |
|
|
|
|
|
|
|
lm.ExecuteInitialLayoutPass(wnd); |
|
|
|
|
|
|
|
target.Bind(ItemsControl.ItemsProperty, new Binding()); |
|
|
|
|
|
|
|
lm.ExecuteLayoutPass(); |
|
|
|
|
|
|
|
var panel = target.Presenter.Panel; |
|
|
|
|
|
|
|
Func<string> itemsToString = () => |
|
|
|
string.Join(",", panel.Children.OfType<ListBoxItem>().Select(l => l.Content.ToString()).ToArray()); |
|
|
|
|
|
|
|
Action<string, string> addafter = (item, newitem) => |
|
|
|
{ |
|
|
|
items.Insert(items.IndexOf(item) + 1, newitem); |
|
|
|
|
|
|
|
lm.ExecuteLayoutPass(); |
|
|
|
}; |
|
|
|
|
|
|
|
Action<string> remove = item => |
|
|
|
{ |
|
|
|
items.Remove(item); |
|
|
|
lm.ExecuteLayoutPass(); |
|
|
|
}; |
|
|
|
|
|
|
|
addafter("1", "1+");//expected 1,1+,2,3,4,5,6,7
|
|
|
|
|
|
|
|
addafter("2", "2+");//expected 1,1+,2,2+,3,4,5,6
|
|
|
|
|
|
|
|
remove("2+");//expected 1,1+,2,3,4,5,6,7
|
|
|
|
|
|
|
|
//Reset items
|
|
|
|
items.Clear(); |
|
|
|
create(); |
|
|
|
|
|
|
|
addafter("1", "1+");//expected 1,1+,2,3,4,5,6,7
|
|
|
|
|
|
|
|
addafter("2", "2+");//expected 1,1+,2,2+,3,4,5,6
|
|
|
|
|
|
|
|
remove("2+");//expected 1,1+,2,3,4,5,6,7
|
|
|
|
|
|
|
|
var sti = itemsToString(); |
|
|
|
|
|
|
|
var lbItems = panel.Children.OfType<ListBoxItem>().ToArray(); |
|
|
|
|
|
|
|
Assert.Equal("1", lbItems[0].Content); |
|
|
|
Assert.Equal("1+", lbItems[1].Content); |
|
|
|
Assert.Equal("2", lbItems[2].Content); |
|
|
|
Assert.Equal("3", lbItems[3].Content); //bug it's 2+ instead
|
|
|
|
Assert.Equal("4", lbItems[4].Content); |
|
|
|
|
|
|
|
int lbi = 0; |
|
|
|
|
|
|
|
//ensure all items are fine
|
|
|
|
foreach (var lb in lbItems) |
|
|
|
{ |
|
|
|
Assert.Equal(items[lbi++], lb.Content); |
|
|
|
} |
|
|
|
|
|
|
|
//Assert.Equal("1,1+,2,3,4,5,6,7", sti);
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private FuncControlTemplate ListBoxTemplate() |
|
|
|
{ |
|
|
|
return new FuncControlTemplate<ListBox>(parent => |
|
|
|
|