|
|
@@ -7,6 +7,7 @@ using Avalonia.Controls.Templates;
|
|
|
using Avalonia.Input;
|
|
|
using Avalonia.LogicalTree;
|
|
|
using Avalonia.Styling;
|
|
|
+using Avalonia.UnitTests;
|
|
|
using Avalonia.VisualTree;
|
|
|
using Xunit;
|
|
|
|
|
|
@@ -20,18 +21,13 @@ namespace Avalonia.Controls.UnitTests
|
|
|
var target = new ListBox
|
|
|
{
|
|
|
Template = CreateListBoxTemplate(),
|
|
|
+ Items = new[] { "Foo" },
|
|
|
ItemTemplate = new FuncDataTemplate<string>(_ => new Canvas()),
|
|
|
};
|
|
|
|
|
|
- target.Items = new[] { "Foo" };
|
|
|
- target.ApplyTemplate();
|
|
|
- target.Presenter.ApplyTemplate();
|
|
|
+ Prepare(target);
|
|
|
|
|
|
var container = (ListBoxItem)target.Presenter.Panel.Children[0];
|
|
|
- container.Template = ListBoxItemTemplate();
|
|
|
- container.ApplyTemplate();
|
|
|
- ((ContentPresenter)container.Presenter).UpdateChild();
|
|
|
-
|
|
|
Assert.IsType<Canvas>(container.Presenter.Child);
|
|
|
}
|
|
|
|
|
|
@@ -43,7 +39,7 @@ namespace Avalonia.Controls.UnitTests
|
|
|
Template = CreateListBoxTemplate(),
|
|
|
};
|
|
|
|
|
|
- ApplyTemplate(target);
|
|
|
+ Prepare(target);
|
|
|
|
|
|
Assert.IsType<ItemsPresenter>(target.Presenter);
|
|
|
}
|
|
|
@@ -51,78 +47,85 @@ namespace Avalonia.Controls.UnitTests
|
|
|
[Fact]
|
|
|
public void ListBoxItem_Containers_Should_Be_Generated()
|
|
|
{
|
|
|
- var items = new[] { "Foo", "Bar", "Baz " };
|
|
|
- var target = new ListBox
|
|
|
+ using (UnitTestApplication.Start(TestServices.MockPlatformRenderInterface))
|
|
|
{
|
|
|
- Template = CreateListBoxTemplate(),
|
|
|
- Items = items,
|
|
|
- };
|
|
|
+ var items = new[] { "Foo", "Bar", "Baz " };
|
|
|
+ var target = new ListBox
|
|
|
+ {
|
|
|
+ Template = CreateListBoxTemplate(),
|
|
|
+ Items = items,
|
|
|
+ };
|
|
|
|
|
|
- ApplyTemplate(target);
|
|
|
+ Prepare(target);
|
|
|
|
|
|
- var text = target.Presenter.Panel.Children
|
|
|
- .OfType<ListBoxItem>()
|
|
|
- .Do(x => x.Template = ListBoxItemTemplate())
|
|
|
- .Do(x => { x.ApplyTemplate(); ((ContentPresenter)x.Presenter).UpdateChild(); })
|
|
|
- .Select(x => x.Presenter.Child)
|
|
|
- .OfType<TextBlock>()
|
|
|
- .Select(x => x.Text)
|
|
|
- .ToList();
|
|
|
+ var text = target.Presenter.Panel.Children
|
|
|
+ .OfType<ListBoxItem>()
|
|
|
+ .Select(x => x.Presenter.Child)
|
|
|
+ .OfType<TextBlock>()
|
|
|
+ .Select(x => x.Text)
|
|
|
+ .ToList();
|
|
|
|
|
|
- Assert.Equal(items, text);
|
|
|
+ Assert.Equal(items, text);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
[Fact]
|
|
|
public void LogicalChildren_Should_Be_Set_For_DataTemplate_Generated_Items()
|
|
|
{
|
|
|
- var target = new ListBox
|
|
|
+ using (UnitTestApplication.Start(TestServices.MockPlatformRenderInterface))
|
|
|
{
|
|
|
- Template = CreateListBoxTemplate(),
|
|
|
- Items = new[] { "Foo", "Bar", "Baz " },
|
|
|
- };
|
|
|
+ var target = new ListBox
|
|
|
+ {
|
|
|
+ Template = CreateListBoxTemplate(),
|
|
|
+ Items = new[] { "Foo", "Bar", "Baz " },
|
|
|
+ };
|
|
|
|
|
|
- ApplyTemplate(target);
|
|
|
+ Prepare(target);
|
|
|
|
|
|
- Assert.Equal(3, target.GetLogicalChildren().Count());
|
|
|
+ Assert.Equal(3, target.GetLogicalChildren().Count());
|
|
|
|
|
|
- foreach (var child in target.GetLogicalChildren())
|
|
|
- {
|
|
|
- Assert.IsType<ListBoxItem>(child);
|
|
|
+ foreach (var child in target.GetLogicalChildren())
|
|
|
+ {
|
|
|
+ Assert.IsType<ListBoxItem>(child);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
[Fact]
|
|
|
public void DataContexts_Should_Be_Correctly_Set()
|
|
|
{
|
|
|
- var items = new object[]
|
|
|
+ using (UnitTestApplication.Start(TestServices.MockPlatformRenderInterface))
|
|
|
{
|
|
|
- "Foo",
|
|
|
- new Item("Bar"),
|
|
|
- new TextBlock { Text = "Baz" },
|
|
|
- new ListBoxItem { Content = "Qux" },
|
|
|
- };
|
|
|
+ var items = new object[]
|
|
|
+ {
|
|
|
+ "Foo",
|
|
|
+ new Item("Bar"),
|
|
|
+ new TextBlock { Text = "Baz" },
|
|
|
+ new ListBoxItem { Content = "Qux" },
|
|
|
+ };
|
|
|
|
|
|
- var target = new ListBox
|
|
|
- {
|
|
|
- Template = CreateListBoxTemplate(),
|
|
|
- DataContext = "Base",
|
|
|
- DataTemplates = new DataTemplates
|
|
|
+ var target = new ListBox
|
|
|
+ {
|
|
|
+ Template = CreateListBoxTemplate(),
|
|
|
+ DataContext = "Base",
|
|
|
+ DataTemplates = new DataTemplates
|
|
|
{
|
|
|
new FuncDataTemplate<Item>(x => new Button { Content = x })
|
|
|
},
|
|
|
- Items = items,
|
|
|
- };
|
|
|
+ Items = items,
|
|
|
+ };
|
|
|
|
|
|
- ApplyTemplate(target);
|
|
|
+ Prepare(target);
|
|
|
|
|
|
- var dataContexts = target.Presenter.Panel.Children
|
|
|
- .Cast<Control>()
|
|
|
- .Select(x => x.DataContext)
|
|
|
- .ToList();
|
|
|
+ var dataContexts = target.Presenter.Panel.Children
|
|
|
+ .Cast<Control>()
|
|
|
+ .Select(x => x.DataContext)
|
|
|
+ .ToList();
|
|
|
|
|
|
- Assert.Equal(
|
|
|
- new object[] { items[0], items[1], "Base", "Base" },
|
|
|
- dataContexts);
|
|
|
+ Assert.Equal(
|
|
|
+ new object[] { items[0], items[1], "Base", "Base" },
|
|
|
+ dataContexts);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
private FuncControlTemplate CreateListBoxTemplate()
|
|
|
@@ -136,6 +139,7 @@ namespace Avalonia.Controls.UnitTests
|
|
|
{
|
|
|
Name = "PART_ItemsPresenter",
|
|
|
[~ItemsPresenter.ItemsProperty] = parent.GetObservable(ItemsControl.ItemsProperty),
|
|
|
+ [~ItemsPresenter.ItemsPanelProperty] = parent.GetObservable(ItemsControl.ItemsPanelProperty),
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
@@ -159,7 +163,7 @@ namespace Avalonia.Controls.UnitTests
|
|
|
};
|
|
|
}
|
|
|
|
|
|
- private void ApplyTemplate(ListBox target)
|
|
|
+ private void Prepare(ListBox target)
|
|
|
{
|
|
|
// Apply the template to the ListBox itself.
|
|
|
target.ApplyTemplate();
|
|
|
@@ -173,6 +177,28 @@ namespace Avalonia.Controls.UnitTests
|
|
|
|
|
|
// Now the ItemsPresenter should be reigstered, so apply its template.
|
|
|
target.Presenter.ApplyTemplate();
|
|
|
+
|
|
|
+ // Because ListBox items are virtualized we need to do a layout to make them appear.
|
|
|
+ target.Measure(new Size(100, 100));
|
|
|
+ target.Arrange(new Rect(0, 0, 100, 100));
|
|
|
+
|
|
|
+ // Now set and apply the item templates.
|
|
|
+ foreach (ListBoxItem item in target.Presenter.Panel.Children)
|
|
|
+ {
|
|
|
+ item.Template = ListBoxItemTemplate();
|
|
|
+ item.ApplyTemplate();
|
|
|
+ item.Presenter.ApplyTemplate();
|
|
|
+ ((ContentPresenter)item.Presenter).UpdateChild();
|
|
|
+ }
|
|
|
+
|
|
|
+ // The items were created before the template was applied, so now we need to go back
|
|
|
+ // and re-arrange everything.
|
|
|
+ foreach (IControl i in target.GetSelfAndVisualDescendents())
|
|
|
+ {
|
|
|
+ i.InvalidateArrange();
|
|
|
+ }
|
|
|
+
|
|
|
+ target.Arrange(new Rect(0, 0, 100, 100));
|
|
|
}
|
|
|
|
|
|
private class Item
|