From c9f6b8dd511d3207b90f0433da7ef25b853738e6 Mon Sep 17 00:00:00 2001 From: Emmanuel Hansen Date: Thu, 27 Mar 2025 04:33:19 -0400 Subject: [PATCH] dismiss popups when toplevel deactivates in embedded scenarios (#18527) --- src/Avalonia.Controls/Primitives/Popup.cs | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Controls/Primitives/Popup.cs b/src/Avalonia.Controls/Primitives/Popup.cs index a90b1fb3b6..f6d54b9546 100644 --- a/src/Avalonia.Controls/Primitives/Popup.cs +++ b/src/Avalonia.Controls/Primitives/Popup.cs @@ -15,6 +15,7 @@ using Avalonia.Metadata; using Avalonia.Platform; using Avalonia.VisualTree; using Avalonia.Media; +using Avalonia.Interactivity; namespace Avalonia.Controls.Primitives { @@ -495,13 +496,13 @@ namespace Avalonia.Controls.Primitives SubscribeToEventHandler>(placementTarget, TargetDetached, (x, handler) => x.DetachedFromVisualTree += handler, (x, handler) => x.DetachedFromVisualTree -= handler).DisposeWith(handlerCleanup); - + if (topLevel is Window window && window.PlatformImpl != null) { SubscribeToEventHandler(window, WindowDeactivated, (x, handler) => x.Deactivated += handler, (x, handler) => x.Deactivated -= handler).DisposeWith(handlerCleanup); - + SubscribeToEventHandler(window.PlatformImpl, WindowLostFocus, (x, handler) => x.LostFocus += handler, (x, handler) => x.LostFocus -= handler).DisposeWith(handlerCleanup); @@ -535,6 +536,12 @@ namespace Avalonia.Controls.Primitives (x, handler) => x.Closed -= handler).DisposeWith(handlerCleanup); } } + else if (topLevel is { } tl && tl.PlatformImpl is ITopLevelImpl pimpl) + { + SubscribeToEventHandler(pimpl, TopLevelLostPlatformFocus, + (x, handler) => x.LostFocus += handler, + (x, handler) => x.LostFocus -= handler).DisposeWith(handlerCleanup); + } InputManager.Instance?.Process.Subscribe(ListenForNonClientClick).DisposeWith(handlerCleanup); @@ -988,6 +995,14 @@ namespace Avalonia.Controls.Primitives } } + private void TopLevelLostPlatformFocus() + { + if (IsLightDismissEnabled) + { + Close(); + } + } + private void PlacementTargetTransformChanged(Visual v, Matrix? matrix) { if (_openState is not null)