Browse Source

feat: include VML itself in layer lookup. (#20999)

pull/21025/head
Dong Bin 6 months ago
committed by GitHub
parent
commit
093976c065
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 2
      src/Avalonia.Controls/Primitives/AdornerLayer.cs
  2. 2
      src/Avalonia.Controls/Primitives/OverlayLayer.cs
  3. 2
      src/Avalonia.Controls/Primitives/PopupOverlayLayer.cs
  4. 2
      src/Avalonia.Controls/Primitives/TextSelectorLayer.cs
  5. 78
      tests/Avalonia.Controls.UnitTests/Primitives/VisualLayerManagerTests.cs

2
src/Avalonia.Controls/Primitives/AdornerLayer.cs

@ -73,7 +73,7 @@ namespace Avalonia.Controls.Primitives
public static AdornerLayer? GetAdornerLayer(Visual visual)
{
// Check if the visual is inside an OverlayLayer with a dedicated AdornerLayer
foreach (var ancestor in visual.GetVisualAncestors())
foreach (var ancestor in visual.GetSelfAndVisualAncestors())
{
if (GetDirectAdornerLayer(ancestor) is { } adornerLayer)
return adornerLayer;

2
src/Avalonia.Controls/Primitives/OverlayLayer.cs

@ -29,7 +29,7 @@ namespace Avalonia.Controls.Primitives
/// <returns>The <see cref="OverlayLayer"/> associated with the visual, or null if no overlay layer exists.</returns>
public static OverlayLayer? GetOverlayLayer(Visual visual)
{
foreach (var v in visual.GetVisualAncestors())
foreach (var v in visual.GetSelfAndVisualAncestors())
if (v is VisualLayerManager { OverlayLayer: { } layer })
return layer;

2
src/Avalonia.Controls/Primitives/PopupOverlayLayer.cs

@ -11,7 +11,7 @@ namespace Avalonia.Controls.Primitives
public static PopupOverlayLayer? GetPopupOverlayLayer(Visual visual)
{
foreach (var v in visual.GetVisualAncestors())
foreach (var v in visual.GetSelfAndVisualAncestors())
if (v is VisualLayerManager { PopupOverlayLayer: { } layer })
return layer;

2
src/Avalonia.Controls/Primitives/TextSelectorLayer.cs

@ -11,7 +11,7 @@ namespace Avalonia.Controls.Primitives
public static TextSelectorLayer? GetTextSelectorLayer(Visual visual)
{
foreach (var v in visual.GetVisualAncestors())
foreach (var v in visual.GetSelfAndVisualAncestors())
if (v is VisualLayerManager { TextSelectorLayer: { } textSelectorLayer })
return textSelectorLayer;

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

@ -33,5 +33,83 @@ namespace Avalonia.Controls.UnitTests.Primitives
Assert.NotNull(mainAdornerLayer);
Assert.NotSame(overlayAdornerLayer, mainAdornerLayer);
}
[Fact]
public void GetAdornerLayer_Returns_Same_AdornerLayer_For_VisualLayerManager()
{
var vlm = new VisualLayerManager();
var root = new TestRoot { Child = vlm };
root.Measure(new Size(100, 100));
root.Arrange(new Rect(0, 0, 100, 100));
var adornerLayer = vlm.AdornerLayer;
Assert.NotNull(adornerLayer);
// The adorner layer for a control inside the OverlayLayer
// should be the dedicated one, not the main VLM adorner layer.
var target = AdornerLayer.GetAdornerLayer(vlm);
Assert.NotNull(target);
Assert.Same(adornerLayer, target);
}
[Fact]
public void GetAdornerLayer_Returns_Same_AdornerLayer_For_Child()
{
var button = new Button();
var vlm = new VisualLayerManager() { Child = button };
var root = new TestRoot { Child = vlm };
root.Measure(new Size(100, 100));
root.Arrange(new Rect(0, 0, 100, 100));
var adornerLayer = vlm.AdornerLayer;
Assert.NotNull(adornerLayer);
// The adorner layer for a control inside the OverlayLayer
// should be the dedicated one, not the main VLM adorner layer.
var target = AdornerLayer.GetAdornerLayer(button);
Assert.NotNull(target);
Assert.Same(adornerLayer, target);
}
[Fact]
public void GetOverlayLayer_Returns_Same_OverlayLayer_For_VisualLayerManager()
{
var vlm = new VisualLayerManager() { EnableOverlayLayer = true };
var root = new TestRoot { Child = vlm };
root.Measure(new Size(100, 100));
root.Arrange(new Rect(0, 0, 100, 100));
var overlayLayer = vlm.OverlayLayer;
Assert.NotNull(overlayLayer);
// The adorner layer for a control inside the OverlayLayer
// should be the dedicated one, not the main VLM adorner layer.
var target = OverlayLayer.GetOverlayLayer(vlm);
Assert.NotNull(target);
Assert.Same(overlayLayer, target);
}
[Fact]
public void GetOverlayLayer_Returns_Same_OverlayLayer_For_Child()
{
var button = new Button();
var vlm = new VisualLayerManager() { EnableOverlayLayer = true, Child = button };
var root = new TestRoot { Child = vlm };
root.Measure(new Size(100, 100));
root.Arrange(new Rect(0, 0, 100, 100));
var overlayLayer = vlm.OverlayLayer;
Assert.NotNull(overlayLayer);
// The adorner layer for a control inside the OverlayLayer
// should be the dedicated one, not the main VLM adorner layer.
var target = OverlayLayer.GetOverlayLayer(button);
Assert.NotNull(target);
Assert.Same(overlayLayer, target);
}
}
}

Loading…
Cancel
Save