From 815d3f719ebbdb2e443e08ced24295e44dea73de Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 12 Oct 2017 09:42:24 +0200 Subject: [PATCH] Report correct root in logical tree attach/detach. Fixes #1192. --- src/Avalonia.Controls/Control.cs | 6 +-- .../ControlTests.cs | 41 ++++++++++++++++++- .../ContentPresenterTests_Standalone.cs | 4 ++ 3 files changed, 46 insertions(+), 5 deletions(-) diff --git a/src/Avalonia.Controls/Control.cs b/src/Avalonia.Controls/Control.cs index f3705c9127..7434bd6cc1 100644 --- a/src/Avalonia.Controls/Control.cs +++ b/src/Avalonia.Controls/Control.cs @@ -773,11 +773,9 @@ namespace Avalonia.Controls { while (e != null) { - var root = e as IStyleRoot; - - if (root != null && root.StylingParent == null) + if (e is IRenderRoot root) { - return root; + return root as IStyleRoot; } e = e.StylingParent; diff --git a/tests/Avalonia.Controls.UnitTests/ControlTests.cs b/tests/Avalonia.Controls.UnitTests/ControlTests.cs index 605406518d..b7e2cbeca9 100644 --- a/tests/Avalonia.Controls.UnitTests/ControlTests.cs +++ b/tests/Avalonia.Controls.UnitTests/ControlTests.cs @@ -123,7 +123,26 @@ namespace Avalonia.Controls.UnitTests } [Fact] - public void DetachedToLogicalParent_Should_Be_Called_When_Removed_From_Tree() + public void AttachedToLogicalParent_Should_Not_Be_Called_With_GlobalStyles_As_Root() + { + var globalStyles = Mock.Of(); + var root = new TestRoot { StylingParent = globalStyles }; + var child = new Border(); + var raised = false; + + child.AttachedToLogicalTree += (s, e) => + { + Assert.Equal(root, e.Root); + raised = true; + }; + + root.Child = child; + + Assert.True(raised); + } + + [Fact] + public void DetachedFromLogicalParent_Should_Be_Called_When_Removed_From_Tree() { var root = new TestRoot(); var parent = new Border(); @@ -148,6 +167,26 @@ namespace Avalonia.Controls.UnitTests Assert.True(grandchildRaised); } + [Fact] + public void DetachedFromLogicalParent_Should_Not_Be_Called_With_GlobalStyles_As_Root() + { + var globalStyles = Mock.Of(); + var root = new TestRoot { StylingParent = globalStyles }; + var child = new Border(); + var raised = false; + + child.DetachedFromLogicalTree += (s, e) => + { + Assert.Equal(root, e.Root); + raised = true; + }; + + root.Child = child; + root.Child = null; + + Assert.True(raised); + } + [Fact] public void Adding_Tree_To_IStyleRoot_Should_Style_Controls() { diff --git a/tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Standalone.cs b/tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Standalone.cs index 032928d673..027e162877 100644 --- a/tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Standalone.cs +++ b/tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Standalone.cs @@ -12,6 +12,7 @@ using Moq; using System; using System.Linq; using Xunit; +using Avalonia.Rendering; namespace Avalonia.Controls.UnitTests.Presenters { @@ -56,6 +57,7 @@ namespace Avalonia.Controls.UnitTests.Presenters var parentMock = new Mock(); parentMock.As(); + parentMock.As(); parentMock.As(); (target as ISetLogicalParent).SetParent(parentMock.Object); @@ -100,6 +102,7 @@ namespace Avalonia.Controls.UnitTests.Presenters }; var parentMock = new Mock(); + parentMock.As(); parentMock.As(); parentMock.As().SetupGet(l => l.IsAttachedToLogicalTree).Returns(true); @@ -144,6 +147,7 @@ namespace Avalonia.Controls.UnitTests.Presenters var parentMock = new Mock(); parentMock.As(); + parentMock.As(); parentMock.As(); (target as ISetLogicalParent).SetParent(parentMock.Object);