Skip to content

Commit 093976c

Browse files
authored
feat: include VML itself in layer lookup. (#20999)
1 parent cdf1299 commit 093976c

File tree

5 files changed

+82
-4
lines changed

5 files changed

+82
-4
lines changed

src/Avalonia.Controls/Primitives/AdornerLayer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public static void SetAdornedElement(Visual adorner, Visual? adorned)
7373
public static AdornerLayer? GetAdornerLayer(Visual visual)
7474
{
7575
// Check if the visual is inside an OverlayLayer with a dedicated AdornerLayer
76-
foreach (var ancestor in visual.GetVisualAncestors())
76+
foreach (var ancestor in visual.GetSelfAndVisualAncestors())
7777
{
7878
if (GetDirectAdornerLayer(ancestor) is { } adornerLayer)
7979
return adornerLayer;

src/Avalonia.Controls/Primitives/OverlayLayer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ internal OverlayLayer()
2929
/// <returns>The <see cref="OverlayLayer"/> associated with the visual, or null if no overlay layer exists.</returns>
3030
public static OverlayLayer? GetOverlayLayer(Visual visual)
3131
{
32-
foreach (var v in visual.GetVisualAncestors())
32+
foreach (var v in visual.GetSelfAndVisualAncestors())
3333
if (v is VisualLayerManager { OverlayLayer: { } layer })
3434
return layer;
3535

src/Avalonia.Controls/Primitives/PopupOverlayLayer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ internal sealed class PopupOverlayLayer : Canvas
1111

1212
public static PopupOverlayLayer? GetPopupOverlayLayer(Visual visual)
1313
{
14-
foreach (var v in visual.GetVisualAncestors())
14+
foreach (var v in visual.GetSelfAndVisualAncestors())
1515
if (v is VisualLayerManager { PopupOverlayLayer: { } layer })
1616
return layer;
1717

src/Avalonia.Controls/Primitives/TextSelectorLayer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public class TextSelectorLayer : Canvas
1111

1212
public static TextSelectorLayer? GetTextSelectorLayer(Visual visual)
1313
{
14-
foreach (var v in visual.GetVisualAncestors())
14+
foreach (var v in visual.GetSelfAndVisualAncestors())
1515
if (v is VisualLayerManager { TextSelectorLayer: { } textSelectorLayer })
1616
return textSelectorLayer;
1717

tests/Avalonia.Controls.UnitTests/Primitives/VisualLayerManagerTests.cs

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,83 @@ public void GetAdornerLayer_Returns_Dedicated_AdornerLayer_For_Controls_Inside_O
3333
Assert.NotNull(mainAdornerLayer);
3434
Assert.NotSame(overlayAdornerLayer, mainAdornerLayer);
3535
}
36+
37+
[Fact]
38+
public void GetAdornerLayer_Returns_Same_AdornerLayer_For_VisualLayerManager()
39+
{
40+
var vlm = new VisualLayerManager();
41+
var root = new TestRoot { Child = vlm };
42+
43+
root.Measure(new Size(100, 100));
44+
root.Arrange(new Rect(0, 0, 100, 100));
45+
46+
var adornerLayer = vlm.AdornerLayer;
47+
Assert.NotNull(adornerLayer);
48+
49+
// The adorner layer for a control inside the OverlayLayer
50+
// should be the dedicated one, not the main VLM adorner layer.
51+
var target = AdornerLayer.GetAdornerLayer(vlm);
52+
Assert.NotNull(target);
53+
Assert.Same(adornerLayer, target);
54+
}
55+
56+
[Fact]
57+
public void GetAdornerLayer_Returns_Same_AdornerLayer_For_Child()
58+
{
59+
var button = new Button();
60+
var vlm = new VisualLayerManager() { Child = button };
61+
var root = new TestRoot { Child = vlm };
62+
63+
root.Measure(new Size(100, 100));
64+
root.Arrange(new Rect(0, 0, 100, 100));
65+
66+
var adornerLayer = vlm.AdornerLayer;
67+
Assert.NotNull(adornerLayer);
68+
69+
// The adorner layer for a control inside the OverlayLayer
70+
// should be the dedicated one, not the main VLM adorner layer.
71+
var target = AdornerLayer.GetAdornerLayer(button);
72+
Assert.NotNull(target);
73+
Assert.Same(adornerLayer, target);
74+
}
75+
76+
[Fact]
77+
public void GetOverlayLayer_Returns_Same_OverlayLayer_For_VisualLayerManager()
78+
{
79+
var vlm = new VisualLayerManager() { EnableOverlayLayer = true };
80+
var root = new TestRoot { Child = vlm };
81+
82+
root.Measure(new Size(100, 100));
83+
root.Arrange(new Rect(0, 0, 100, 100));
84+
85+
var overlayLayer = vlm.OverlayLayer;
86+
Assert.NotNull(overlayLayer);
87+
88+
// The adorner layer for a control inside the OverlayLayer
89+
// should be the dedicated one, not the main VLM adorner layer.
90+
var target = OverlayLayer.GetOverlayLayer(vlm);
91+
Assert.NotNull(target);
92+
Assert.Same(overlayLayer, target);
93+
}
94+
95+
[Fact]
96+
public void GetOverlayLayer_Returns_Same_OverlayLayer_For_Child()
97+
{
98+
var button = new Button();
99+
var vlm = new VisualLayerManager() { EnableOverlayLayer = true, Child = button };
100+
var root = new TestRoot { Child = vlm };
101+
102+
root.Measure(new Size(100, 100));
103+
root.Arrange(new Rect(0, 0, 100, 100));
104+
105+
var overlayLayer = vlm.OverlayLayer;
106+
Assert.NotNull(overlayLayer);
107+
108+
// The adorner layer for a control inside the OverlayLayer
109+
// should be the dedicated one, not the main VLM adorner layer.
110+
var target = OverlayLayer.GetOverlayLayer(button);
111+
Assert.NotNull(target);
112+
Assert.Same(overlayLayer, target);
113+
}
36114
}
37115
}

0 commit comments

Comments
 (0)