From c82faefd1419166ed84b437feb0afc8d45d331b3 Mon Sep 17 00:00:00 2001 From: CHINBOY Date: Wed, 18 Jun 2025 18:41:05 +0800 Subject: [PATCH] Refactor Popup ShadowLayer resize bug --- .../Popup/PopupBuddyDecorator.cs | 41 +++++++++++++------ src/AtomUI.Controls/Popup/PopupBuddyLayer.cs | 1 - 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/AtomUI.Controls/Popup/PopupBuddyDecorator.cs b/src/AtomUI.Controls/Popup/PopupBuddyDecorator.cs index 3979d45c9..2e37bcf0d 100644 --- a/src/AtomUI.Controls/Popup/PopupBuddyDecorator.cs +++ b/src/AtomUI.Controls/Popup/PopupBuddyDecorator.cs @@ -35,31 +35,38 @@ internal class PopupBuddyDecorator : SceneMotionActorControl _popup = popup; _decoratorControl = new MotionGhostControl(); BindUtils.RelayBind(this, MaskShadowsProperty, _decoratorControl, MotionGhostControl.MaskShadowsProperty); + if (_popup is IPopupHostProvider popupHostProvider) { - if (popupHostProvider.PopupHost == null) + if (popupHostProvider.PopupHost != null) { - popupHostProvider.PopupHostChanged += host => - { - _popupHost = host; - if (_popupHost != null) - { - ConfigureDecorator(_popupHost); - } - }; + SetupPopupHost(popupHostProvider.PopupHost); } else { - _popupHost = popupHostProvider.PopupHost; - if (_popupHost != null) + popupHostProvider.PopupHostChanged += host => { - ConfigureDecorator(_popupHost); - } + SetupPopupHost(host); + }; } } Child = _decoratorControl; } + + private void SetupPopupHost(IPopupHost? popupHost) + { + if (popupHost is PopupRoot popupRoot) + { + if (_popupHost is PopupRoot oldPopupRoot) + { + oldPopupRoot.SizeChanged -= HandleBuddyPopupRootSizeChanged; + } + popupRoot.SizeChanged += HandleBuddyPopupRootSizeChanged; + ConfigureDecorator(popupRoot); + } + _popupHost = popupHost; + } private void ConfigureDecorator(IPopupHost popupHost) { @@ -91,6 +98,14 @@ internal class PopupBuddyDecorator : SceneMotionActorControl } } + private void HandleBuddyPopupRootSizeChanged(object? sender, SizeChangedEventArgs e) + { + if (sender is PopupRoot popupRoot) + { + ConfigureDecorator(popupRoot); + } + } + protected override Point CalculateTopLevelGhostPosition() { var thickness = MaskShadows.Thickness(); diff --git a/src/AtomUI.Controls/Popup/PopupBuddyLayer.cs b/src/AtomUI.Controls/Popup/PopupBuddyLayer.cs index 770edc632..a0347184c 100644 --- a/src/AtomUI.Controls/Popup/PopupBuddyLayer.cs +++ b/src/AtomUI.Controls/Popup/PopupBuddyLayer.cs @@ -66,7 +66,6 @@ internal class PopupBuddyLayer : SceneLayer, IPopupBuddyLayer, IShadowAwareLayer } } } - private void SetupPopupHost(IPopupHost? popupHost) {