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) {