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 @@
-
-
-
-
-
-