diff --git a/src/Avalonia.Controls/Primitives/LightDismissOverlayLayer.cs b/src/Avalonia.Controls/Primitives/LightDismissOverlayLayer.cs index 65a21a563a..ede9a9b635 100644 --- a/src/Avalonia.Controls/Primitives/LightDismissOverlayLayer.cs +++ b/src/Avalonia.Controls/Primitives/LightDismissOverlayLayer.cs @@ -1,10 +1,41 @@ +using System; using System.Linq; -using Avalonia.Rendering; +using Avalonia.Controls.Templates; +using Avalonia.Styling; using Avalonia.VisualTree; +#nullable enable + namespace Avalonia.Controls.Primitives { + /// + /// A layer that is used to dismiss a when the user clicks outside. + /// public class LightDismissOverlayLayer : Border { + /// + /// Returns the light dismiss overlay for a specified visual. + /// + /// The visual. + /// The light dismiss overlay, or null if none found. + public static LightDismissOverlayLayer? GetLightDismissOverlayLayer(IVisual visual) + { + visual = visual ?? throw new ArgumentNullException(nameof(visual)); + + VisualLayerManager? manager; + + if (visual is TopLevel topLevel) + { + manager = topLevel.GetTemplateChildren() + .OfType() + .FirstOrDefault(); + } + else + { + manager = visual.FindAncestorOfType(); + } + + return manager?.LightDismissOverlayLayer; + } } } diff --git a/src/Avalonia.Controls/Primitives/Popup.cs b/src/Avalonia.Controls/Primitives/Popup.cs index 01ae6fbf43..00bb026d0f 100644 --- a/src/Avalonia.Controls/Primitives/Popup.cs +++ b/src/Avalonia.Controls/Primitives/Popup.cs @@ -384,8 +384,7 @@ namespace Avalonia.Controls.Primitives if (!StaysOpen) { - var layerManager = placementTarget.FindAncestorOfType(); - var dismissLayer = layerManager?.LightDismissOverlayLayer; + var dismissLayer = LightDismissOverlayLayer.GetLightDismissOverlayLayer(placementTarget); if (dismissLayer != null) { diff --git a/tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs b/tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs index fd06ba295b..5519c11582 100644 --- a/tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs +++ b/tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs @@ -392,7 +392,8 @@ namespace Avalonia.Controls.UnitTests.Primitives ++raised; }; - window.RaiseEvent(press); + var lightDismissLayer = window.FindDescendantOfType().LightDismissOverlayLayer; + lightDismissLayer.RaiseEvent(press); Assert.Equal(1, raised); }