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);
}