diff --git a/api/Avalonia.nupkg.xml b/api/Avalonia.nupkg.xml index 1ff3e2fd3b..96f0ab5a30 100644 --- a/api/Avalonia.nupkg.xml +++ b/api/Avalonia.nupkg.xml @@ -301,6 +301,12 @@ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll current/Avalonia/lib/net10.0/Avalonia.Controls.dll + + CP0001 + T:Avalonia.Controls.Primitives.ChromeOverlayLayer + baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll + current/Avalonia/lib/net10.0/Avalonia.Controls.dll + CP0001 T:Avalonia.Controls.Primitives.IPopupHost @@ -667,6 +673,12 @@ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll current/Avalonia/lib/net8.0/Avalonia.Controls.dll + + CP0001 + T:Avalonia.Controls.Primitives.ChromeOverlayLayer + baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll + current/Avalonia/lib/net8.0/Avalonia.Controls.dll + CP0001 T:Avalonia.Controls.Primitives.IPopupHost @@ -1291,6 +1303,12 @@ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll current/Avalonia/lib/net10.0/Avalonia.Controls.dll + + CP0002 + F:Avalonia.Controls.Primitives.VisualLayerManager.ChromeOverlayLayerProperty + baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll + current/Avalonia/lib/net10.0/Avalonia.Controls.dll + CP0002 F:Avalonia.Controls.TextBlock.LetterSpacingProperty @@ -1615,6 +1633,12 @@ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll current/Avalonia/lib/net10.0/Avalonia.Controls.dll + + CP0002 + M:Avalonia.Controls.Primitives.VisualLayerManager.get_ChromeOverlayLayer + baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll + current/Avalonia/lib/net10.0/Avalonia.Controls.dll + CP0002 M:Avalonia.Controls.Primitives.VisualLayerManager.get_LightDismissOverlayLayer @@ -2377,6 +2401,12 @@ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll current/Avalonia/lib/net8.0/Avalonia.Controls.dll + + CP0002 + F:Avalonia.Controls.Primitives.VisualLayerManager.ChromeOverlayLayerProperty + baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll + current/Avalonia/lib/net8.0/Avalonia.Controls.dll + CP0002 F:Avalonia.Controls.TextBlock.LetterSpacingProperty @@ -2701,6 +2731,12 @@ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll current/Avalonia/lib/net8.0/Avalonia.Controls.dll + + CP0002 + M:Avalonia.Controls.Primitives.VisualLayerManager.get_ChromeOverlayLayer + baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll + current/Avalonia/lib/net8.0/Avalonia.Controls.dll + CP0002 M:Avalonia.Controls.Primitives.VisualLayerManager.get_LightDismissOverlayLayer diff --git a/src/Avalonia.Controls/Primitives/ChromeOverlayLayer.cs b/src/Avalonia.Controls/Primitives/ChromeOverlayLayer.cs index 74b5beecad..d925a7a70c 100644 --- a/src/Avalonia.Controls/Primitives/ChromeOverlayLayer.cs +++ b/src/Avalonia.Controls/Primitives/ChromeOverlayLayer.cs @@ -4,27 +4,8 @@ using Avalonia.VisualTree; namespace Avalonia.Controls.Primitives { - public class ChromeOverlayLayer : Panel + internal class ChromeOverlayLayer : Panel { - public static Panel? GetOverlayLayer(Visual visual) - { - foreach (var v in visual.GetVisualAncestors()) - if (v is VisualLayerManager vlm) - if (vlm.OverlayLayer != null) - return vlm.ChromeOverlayLayer; - if (visual is TopLevel tl) - { - var layers = tl.GetVisualDescendants().OfType().FirstOrDefault(); - return layers?.ChromeOverlayLayer; - } - - return null; - } - - public void Add(Control c) - { - base.Children.Add(c); - } } } diff --git a/src/Avalonia.Controls/Primitives/VisualLayerManager.cs b/src/Avalonia.Controls/Primitives/VisualLayerManager.cs index 4c4f4f6b44..18a50fb5c0 100644 --- a/src/Avalonia.Controls/Primitives/VisualLayerManager.cs +++ b/src/Avalonia.Controls/Primitives/VisualLayerManager.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using Avalonia.Controls.Chrome; using Avalonia.LogicalTree; namespace Avalonia.Controls.Primitives @@ -14,9 +15,6 @@ namespace Avalonia.Controls.Primitives private ILogicalRoot? _logicalRoot; private readonly List _layers = new(); - public static readonly StyledProperty ChromeOverlayLayerProperty = - AvaloniaProperty.Register(nameof(ChromeOverlayLayer)); - public bool IsPopup { get; set; } internal AdornerLayer AdornerLayer @@ -30,29 +28,42 @@ namespace Avalonia.Controls.Primitives } } - [System.Diagnostics.CodeAnalysis.SuppressMessage("AvaloniaProperty", "AVP1030")] - [System.Diagnostics.CodeAnalysis.SuppressMessage("AvaloniaProperty", "AVP1031", - Justification = "A hack to make ChromeOverlayLayer lazily creatable. It is expected that GetValue(ChromeOverlayLayerProperty) alone won't work.")] - public ChromeOverlayLayer ChromeOverlayLayer - { - get - { - var current = GetValue(ChromeOverlayLayerProperty); - if (current is null) - { - var chromeOverlayLayer = new ChromeOverlayLayer(); - AddLayer(chromeOverlayLayer, ChromeZIndex); + protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e) + { + EnsureChromeOverlayIfNeeded(); + + base.OnAttachedToVisualTree(e); + } - SetValue(ChromeOverlayLayerProperty, chromeOverlayLayer); + void EnsureChromeOverlayIfNeeded() + { + // HACK: This is a replacement hack for the old set of hacks for TitleBar. - current = chromeOverlayLayer; + // Check if we are attached direclty-ish to a Window (i. e. no other VisualLayerManager in between). + // If we are, then we are the "main" VisualLayerManager and should create the ChromeOverlayLayer and add titlebar there + var parent = VisualParent; + while (parent != null) + { + if(parent is VisualLayerManager) + break; + else if (parent is Window window) + { + if (FindLayer() == null) + { + var layer = new ChromeOverlayLayer(); + AddLayer(layer, ChromeZIndex); + layer.Children.Add(new TitleBar()); + } + + break; } - return current; + parent = parent.VisualParent; + } } - + internal OverlayLayer? OverlayLayer { get diff --git a/src/Avalonia.Themes.Fluent/Controls/Window.xaml b/src/Avalonia.Themes.Fluent/Controls/Window.xaml index 52d16e7ada..f56c9fbd10 100644 --- a/src/Avalonia.Themes.Fluent/Controls/Window.xaml +++ b/src/Avalonia.Themes.Fluent/Controls/Window.xaml @@ -15,9 +15,6 @@ - - - - - -