diff --git a/src/Avalonia.Controls/Notifications/ReversibleStackPanel.cs b/src/Avalonia.Controls/Notifications/ReversibleStackPanel.cs index b64d94ff9b..69df8209b9 100644 --- a/src/Avalonia.Controls/Notifications/ReversibleStackPanel.cs +++ b/src/Avalonia.Controls/Notifications/ReversibleStackPanel.cs @@ -24,6 +24,11 @@ namespace Avalonia.Controls set => SetValue(ReverseOrderProperty, value); } + static ReversibleStackPanel() + { + AffectsArrange(ReverseOrderProperty); + } + /// protected override Size ArrangeOverride(Size finalSize) { diff --git a/tests/Avalonia.Controls.UnitTests/ReversibleStackPanelTests.cs b/tests/Avalonia.Controls.UnitTests/ReversibleStackPanelTests.cs new file mode 100644 index 0000000000..2291ff7d8c --- /dev/null +++ b/tests/Avalonia.Controls.UnitTests/ReversibleStackPanelTests.cs @@ -0,0 +1,48 @@ +using Avalonia.UnitTests; +using Xunit; + +namespace Avalonia.Controls.UnitTests +{ + public class ReversibleStackPanelTests : ScopedTestBase + { + [Fact] + public void Arranges_In_Reverse_Order() + { + var target = new ReversibleStackPanel + { + ReverseOrder = true, + Children = + { + new Border { Height = 30, Width = 10 }, + new Border { Height = 50 }, + } + }; + + target.Measure(Size.Infinity); + target.Arrange(new Rect(target.DesiredSize)); + + Assert.Equal(new Rect(0, 50, 10, 30), target.Children[0].Bounds); + Assert.Equal(new Rect(0, 0, 10, 50), target.Children[1].Bounds); + } + + [Fact] + public void Invalidates_Arrange_On_Reverse_Order_Change() + { + var target = new ReversibleStackPanel + { + Children = + { + new Border(), + new Border(), + } + }; + + target.Measure(Size.Infinity); + target.Arrange(new Rect(target.DesiredSize)); + target.ReverseOrder = true; + + Assert.True(target.IsMeasureValid); + Assert.False(target.IsArrangeValid); + } + } +}