From 65b1c4579ebbdbb5e79bf20d89f1eb5fab4740af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartosz=20Korczy=C5=84ski?= Date: Thu, 7 Mar 2024 06:18:43 +0000 Subject: [PATCH] Fix TextBox in AdornerLayer causes collection modified exception in Arrange pass (#14714) --- .../Primitives/VisualLayerManager.cs | 6 ++++- .../TextBoxTests.cs | 25 ++++++++++++++++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Controls/Primitives/VisualLayerManager.cs b/src/Avalonia.Controls/Primitives/VisualLayerManager.cs index 90260c1546..889662f02c 100644 --- a/src/Avalonia.Controls/Primitives/VisualLayerManager.cs +++ b/src/Avalonia.Controls/Primitives/VisualLayerManager.cs @@ -160,8 +160,12 @@ namespace Avalonia.Controls.Primitives /// 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)); + } + return base.ArrangeOverride(finalSize); } } diff --git a/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs b/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs index 12fd9ef343..1cd42a6c6a 100644 --- a/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs +++ b/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs @@ -1406,7 +1406,7 @@ namespace Avalonia.Controls.UnitTests } [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)) { @@ -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] [InlineData("A\nBB\nCCC\nDDDD", 0, 0)] [InlineData("A\nBB\nCCC\nDDDD", 1, 2)]