From 833ec3ea61dc41d045802458c4f4065325c5c6d4 Mon Sep 17 00:00:00 2001 From: chinboy Date: Wed, 16 Jul 2025 13:59:36 +0800 Subject: [PATCH] Refactor PopupBuddyLayer --- src/AtomUI.Controls/Popup/Popup.cs | 18 ++++++++++++++---- src/AtomUI.Controls/Popup/PopupBuddyLayer.cs | 5 ++--- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/AtomUI.Controls/Popup/Popup.cs b/src/AtomUI.Controls/Popup/Popup.cs index 28cca7e65..69aa7f1d5 100644 --- a/src/AtomUI.Controls/Popup/Popup.cs +++ b/src/AtomUI.Controls/Popup/Popup.cs @@ -18,6 +18,7 @@ using Avalonia.Layout; using Avalonia.LogicalTree; using Avalonia.Media; using Avalonia.Threading; +using Avalonia.VisualTree; namespace AtomUI.Controls; @@ -155,7 +156,7 @@ public class Popup : AvaloniaPopup, { this.BindWaveSpiritProperties(); Closed += HandleClosed; - Opened += HandleOpened; + Opened += HandleOpened; } // Popup 好像不加入视觉树,所以我们放在逻辑树 @@ -280,6 +281,10 @@ public class Popup : AvaloniaPopup, private void CreateBuddyLayer() { + if (_buddyLayer != null) + { + _buddyLayer.Detach(); + } var topLevel = TopLevel.GetTopLevel(PlacementTarget ?? Parent as Visual); Debug.Assert(topLevel is not null); _buddyLayer = new PopupBuddyLayer(this, topLevel); @@ -511,12 +516,9 @@ public class Popup : AvaloniaPopup, { return; } - if (!IsMotionEnabled) { Open(); - Debug.Assert(_buddyLayer != null); - _buddyLayer.Attach(); opened?.Invoke(); (Host as PopupRoot)?.PlatformImpl?.SetTopmost(true); return; @@ -611,6 +613,14 @@ public class Popup : AvaloniaPopup, { _isNeedWaitFlipSync = true; } + else if (change.Property == PlacementTargetProperty) + { + var newTarget = change.GetNewValue(); + if (newTarget != null) + { + CreateBuddyLayer(); + } + } } } diff --git a/src/AtomUI.Controls/Popup/PopupBuddyLayer.cs b/src/AtomUI.Controls/Popup/PopupBuddyLayer.cs index 18490f802..c5efa2b0c 100644 --- a/src/AtomUI.Controls/Popup/PopupBuddyLayer.cs +++ b/src/AtomUI.Controls/Popup/PopupBuddyLayer.cs @@ -162,7 +162,8 @@ internal class PopupBuddyLayer : SceneLayer, IPopupBuddyLayer, IShadowAwareLayer public void Attach() { - _buddyDecorator.CaptureContentControl(); + SetupPopupHost(); + _buddyDecorator.ConfigureBlankContentControl(); if (OperatingSystem.IsMacOS()) { PlatformImpl?.SetTopmost(true); @@ -182,8 +183,6 @@ internal class PopupBuddyLayer : SceneLayer, IPopupBuddyLayer, IShadowAwareLayer { Show(); } - - SetupPopupHost(); } public void Detach()