From 529b279549f6570745565b0c2b3d4eabf4dad5e8 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 9 Jul 2020 22:02:37 +0200 Subject: [PATCH] Fix failing popup tests. --- .../Primitives/LightDismissOverlayLayer.cs | 33 ++++++++++++++++++- src/Avalonia.Controls/Primitives/Popup.cs | 3 +- .../Primitives/PopupTests.cs | 3 +- 3 files changed, 35 insertions(+), 4 deletions(-) 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); }