diff --git a/src/Avalonia.Controls/Primitives/Popup.cs b/src/Avalonia.Controls/Primitives/Popup.cs index 81d01ff74f..ae62922cb0 100644 --- a/src/Avalonia.Controls/Primitives/Popup.cs +++ b/src/Avalonia.Controls/Primitives/Popup.cs @@ -268,8 +268,13 @@ namespace Avalonia.Controls.Primitives { base.OnDetachedFromLogicalTree(e); _topLevel = null; - _popupRoot?.Dispose(); - _popupRoot = null; + + if (_popupRoot != null) + { + ((ISetLogicalParent)_popupRoot).SetParent(null); + _popupRoot.Dispose(); + _popupRoot = null; + } } /// diff --git a/tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs b/tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs index 5581087b5f..13d97920ee 100644 --- a/tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs +++ b/tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs @@ -166,6 +166,24 @@ namespace Avalonia.Controls.UnitTests.Primitives } } + [Fact] + public void PopupRoot_Should_Be_Detached_From_Logical_Tree_When_Popup_Is_Detached() + { + using (CreateServices()) + { + var target = new Popup(); + var root = new TestRoot { Child = target }; + + target.Open(); + + var popupRoot = (ILogical)target.PopupRoot; + + Assert.True(popupRoot.IsAttachedToLogicalTree); + root.Child = null; + Assert.False(((ILogical)target).IsAttachedToLogicalTree); + } + } + [Fact] public void PopupRoot_Should_Have_Template_Applied() {