diff --git a/src/Avalonia.Layout/LayoutManager.cs b/src/Avalonia.Layout/LayoutManager.cs index 0933af7d7e..2158a06992 100644 --- a/src/Avalonia.Layout/LayoutManager.cs +++ b/src/Avalonia.Layout/LayoutManager.cs @@ -14,8 +14,8 @@ namespace Avalonia.Layout /// public class LayoutManager : ILayoutManager { - private readonly HashSet _toMeasure = new HashSet(); - private readonly HashSet _toArrange = new HashSet(); + private readonly Queue _toMeasure = new Queue(); + private readonly Queue _toArrange = new Queue(); private bool _queued; private bool _running; @@ -30,9 +30,12 @@ namespace Avalonia.Layout Contract.Requires(control != null); Dispatcher.UIThread.VerifyAccess(); - _toMeasure.Add(control); - _toArrange.Add(control); - QueueLayoutPass(); + if (control.IsAttachedToVisualTree) + { + _toMeasure.Enqueue(control); + _toArrange.Enqueue(control); + QueueLayoutPass(); + } } /// @@ -41,8 +44,11 @@ namespace Avalonia.Layout Contract.Requires(control != null); Dispatcher.UIThread.VerifyAccess(); - _toArrange.Add(control); - QueueLayoutPass(); + if (control.IsAttachedToVisualTree) + { + _toArrange.Enqueue(control); + QueueLayoutPass(); + } } /// @@ -108,8 +114,12 @@ namespace Avalonia.Layout { while (_toMeasure.Count > 0) { - var next = _toMeasure.First(); - Measure(next); + var control = _toMeasure.Dequeue(); + + if (!control.IsMeasureValid && control.IsAttachedToVisualTree) + { + Measure(control); + } } } @@ -117,8 +127,12 @@ namespace Avalonia.Layout { while (_toArrange.Count > 0 && _toMeasure.Count == 0) { - var next = _toArrange.First(); - Arrange(next); + var control = _toArrange.Dequeue(); + + if (!control.IsArrangeValid && control.IsAttachedToVisualTree) + { + Arrange(control); + } } } @@ -140,8 +154,6 @@ namespace Avalonia.Layout control.Measure(control.PreviousMeasure.Value); } } - - _toMeasure.Remove(control); } private void Arrange(ILayoutable control) @@ -162,8 +174,6 @@ namespace Avalonia.Layout control.Arrange(control.PreviousArrange.Value); } } - - _toArrange.Remove(control); } private void QueueLayoutPass()