From 792d9f1a0589fff578948345bfdb0197b5767d48 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Sat, 5 Jan 2019 17:46:29 +0100 Subject: [PATCH 1/3] Added failing test for #2191. Check that when content is created via `DataTemplate`, it is correctly added as a logical child. --- .../TabControlTests.cs | 50 +++++++++++++------ 1 file changed, 35 insertions(+), 15 deletions(-) diff --git a/tests/Avalonia.Controls.UnitTests/TabControlTests.cs b/tests/Avalonia.Controls.UnitTests/TabControlTests.cs index a5c3881d37..ddc573c74b 100644 --- a/tests/Avalonia.Controls.UnitTests/TabControlTests.cs +++ b/tests/Avalonia.Controls.UnitTests/TabControlTests.cs @@ -267,26 +267,46 @@ namespace Avalonia.Controls.UnitTests Assert.Null(page.Content); } + [Fact] + public void DataTemplate_Created_Content_Should_Be_Logical_Child_After_ApplyTemplate() + { + TabControl target = new TabControl + { + Template = TabControlTemplate(), + ContentTemplate = new FuncDataTemplate(x => + new TextBlock { Tag = "bar", Text = x }), + Items = new[] { "Foo" }, + }; + + ApplyTemplate(target); + target.ContentPart.UpdateChild(); + + var content = Assert.IsType(target.ContentPart.Child); + Assert.Equal("bar", content.Tag); + Assert.Same(target, content.GetLogicalParent()); + Assert.Single(target.GetLogicalChildren(), content); + } + private IControlTemplate TabControlTemplate() { return new FuncControlTemplate(parent => - new StackPanel { - Children = { - new ItemsPresenter - { - Name = "PART_ItemsPresenter", - [!TabStrip.ItemsProperty] = parent[!TabControl.ItemsProperty], - [!TabStrip.ItemTemplateProperty] = parent[!TabControl.ItemTemplateProperty], - }, - new ContentPresenter - { - Name = "PART_Content", - [!ContentPresenter.ContentProperty] = parent[!TabControl.SelectedContentProperty], - [!ContentPresenter.ContentTemplateProperty] = parent[!TabControl.SelectedContentTemplateProperty], - } - } + Children = + { + new ItemsPresenter + { + Name = "PART_ItemsPresenter", + [!TabStrip.ItemsProperty] = parent[!TabControl.ItemsProperty], + [!TabStrip.ItemTemplateProperty] = parent[!TabControl.ItemTemplateProperty], + }, + new ContentPresenter + { + Name = "PART_Content", + [!ContentPresenter.ContentProperty] = parent[!TabControl.SelectedContentProperty], + [!ContentPresenter.ContentTemplateProperty] = parent[!TabControl.SelectedContentTemplateProperty], + } + } }); } From 3d578464c60a91c2dd7a621966f3691f1fdcef72 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Sat, 5 Jan 2019 18:17:55 +0100 Subject: [PATCH 2/3] Register TabControl with ContentControlMixin. `ContentControlMixin` implements a number of behaviors related to logical children that controls that have a `ContentPresenter` need in order to function correctly. Also renamed `PART_Content` to `PART_SelectedContentHost` to match WPF Fixes #2191 --- samples/ControlCatalog/SideBar.xaml | 2 +- src/Avalonia.Controls/TabControl.cs | 7 ++++++- src/Avalonia.Themes.Default/TabControl.xaml | 2 +- tests/Avalonia.Controls.UnitTests/TabControlTests.cs | 2 +- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/samples/ControlCatalog/SideBar.xaml b/samples/ControlCatalog/SideBar.xaml index f97a3064e7..625b344b8c 100644 --- a/samples/ControlCatalog/SideBar.xaml +++ b/samples/ControlCatalog/SideBar.xaml @@ -26,7 +26,7 @@ (SelectionMode.AlwaysSelected); ItemsPanelProperty.OverrideDefaultValue(DefaultPanel); AffectsMeasure(TabStripPlacementProperty); + ContentControlMixin.Attach( + SelectedContentProperty, + x => x.LogicalChildren, + "PART_SelectedContentHost"); } /// @@ -142,7 +147,7 @@ namespace Avalonia.Controls ItemsPresenterPart = e.NameScope.Get("PART_ItemsPresenter"); - ContentPart = e.NameScope.Get("PART_Content"); + ContentPart = e.NameScope.Get("PART_SelectedContentHost"); } /// diff --git a/src/Avalonia.Themes.Default/TabControl.xaml b/src/Avalonia.Themes.Default/TabControl.xaml index a492698feb..60c70ebfda 100644 --- a/src/Avalonia.Themes.Default/TabControl.xaml +++ b/src/Avalonia.Themes.Default/TabControl.xaml @@ -18,7 +18,7 @@ MemberSelector="{TemplateBinding MemberSelector}" > Date: Sat, 5 Jan 2019 18:19:17 +0100 Subject: [PATCH 3/3] Put TabControlPage in alphabetical order. --- samples/ControlCatalog/MainView.xaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/ControlCatalog/MainView.xaml b/samples/ControlCatalog/MainView.xaml index 0f7f2e80a8..2ddb5887e5 100644 --- a/samples/ControlCatalog/MainView.xaml +++ b/samples/ControlCatalog/MainView.xaml @@ -32,10 +32,10 @@ + -