Browse Source

Fix TextBox in AdornerLayer causes collection modified exception in Arrange pass (#14714)

pull/14856/head
Bartosz Korczyński 2 years ago
committed by GitHub
parent
commit
65b1c4579e
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 6
      src/Avalonia.Controls/Primitives/VisualLayerManager.cs
  2. 25
      tests/Avalonia.Controls.UnitTests/TextBoxTests.cs

6
src/Avalonia.Controls/Primitives/VisualLayerManager.cs

@ -160,8 +160,12 @@ namespace Avalonia.Controls.Primitives
/// <inheritdoc /> /// <inheritdoc />
protected override Size ArrangeOverride(Size finalSize) protected override Size ArrangeOverride(Size finalSize)
{ {
foreach (var l in _layers) for (var index = 0; index < _layers.Count; index++)
{
var l = _layers[index];
l.Arrange(new Rect(finalSize)); l.Arrange(new Rect(finalSize));
}
return base.ArrangeOverride(finalSize); return base.ArrangeOverride(finalSize);
} }
} }

25
tests/Avalonia.Controls.UnitTests/TextBoxTests.cs

@ -1406,7 +1406,7 @@ namespace Avalonia.Controls.UnitTests
} }
[Fact] [Fact]
public void TextBox_In_AdornerLayer_Will_Not_Cause_Collection_Modified_In_VisualLayerManager() public void TextBox_In_AdornerLayer_Will_Not_Cause_Collection_Modified_In_VisualLayerManager_Measure()
{ {
using (UnitTestApplication.Start(Services)) using (UnitTestApplication.Start(Services))
{ {
@ -1428,6 +1428,29 @@ namespace Avalonia.Controls.UnitTests
} }
} }
[Fact]
public void TextBox_In_AdornerLayer_Will_Not_Cause_Collection_Modified_In_VisualLayerManager_Arrange()
{
using (UnitTestApplication.Start(Services))
{
var button = new Button();
var visualLayerManager = new VisualLayerManager() { Child = button };
var root = new TestRoot()
{
Child = visualLayerManager
};
var adorner = new TextBox { Template = CreateTemplate(), Text = "a" };
var adornerLayer = AdornerLayer.GetAdornerLayer(button);
root.Measure(new Size(10, 10));
adornerLayer.Children.Add(adorner);
AdornerLayer.SetAdornedElement(adorner, button);
root.Arrange(new Rect(0, 0, 10, 10));
}
}
[Theory] [Theory]
[InlineData("A\nBB\nCCC\nDDDD", 0, 0)] [InlineData("A\nBB\nCCC\nDDDD", 0, 0)]
[InlineData("A\nBB\nCCC\nDDDD", 1, 2)] [InlineData("A\nBB\nCCC\nDDDD", 1, 2)]

Loading…
Cancel
Save