소스 검색

Fix Collection Was Modified exception in VisualLayerManager when a TextBox was added to an AdornerLayer (#14484)

Bartosz Korczyński 1 년 전
부모
커밋
08b422fe01
2개의 변경된 파일28개의 추가작업 그리고 1개의 파일을 삭제
  1. 5 1
      src/Avalonia.Controls/Primitives/VisualLayerManager.cs
  2. 23 0
      tests/Avalonia.Controls.UnitTests/TextBoxTests.cs

+ 5 - 1
src/Avalonia.Controls/Primitives/VisualLayerManager.cs

@@ -148,8 +148,12 @@ namespace Avalonia.Controls.Primitives
         /// <inheritdoc />
         protected override Size MeasureOverride(Size availableSize)
         {
-            foreach (var l in _layers)
+            for (var index = 0; index < _layers.Count; index++)
+            {
+                var l = _layers[index];
                 l.Measure(availableSize);
+            }
+
             return base.MeasureOverride(availableSize);
         }
 

+ 23 - 0
tests/Avalonia.Controls.UnitTests/TextBoxTests.cs

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