From 086c2c7e707df65c0ade4192b01b13a623bcee82 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 10 Nov 2022 11:25:44 +0100 Subject: [PATCH] Don't apply styling in TopLevel ctor. Applying styling in the constructor isn't a good idea as demonstrated by #8549.. Instead apply styling when showing a window, or if it's needed call `ApplyStyling` manually, e.g. in unit tests. Fixes #8549 --- src/Avalonia.Base/PropertyStore/ValueStore.cs | 3 +-- src/Avalonia.Controls/TopLevel.cs | 2 -- src/Avalonia.Controls/Window.cs | 2 ++ src/Avalonia.Controls/WindowBase.cs | 1 + .../AutoCompleteBoxTests.cs | 1 + tests/Avalonia.Controls.UnitTests/ContextMenuTests.cs | 10 +++++++++- tests/Avalonia.Controls.UnitTests/MenuItemTests.cs | 3 +++ .../Avalonia.Controls.UnitTests/NumericUpDownTests.cs | 1 + .../Primitives/PopupRootTests.cs | 2 ++ .../Primitives/PopupTests.cs | 2 ++ tests/Avalonia.Controls.UnitTests/ToolTipTests.cs | 8 ++++++++ .../Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs | 7 ++++++- 12 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/Avalonia.Base/PropertyStore/ValueStore.cs b/src/Avalonia.Base/PropertyStore/ValueStore.cs index 8790991182..d858e30212 100644 --- a/src/Avalonia.Base/PropertyStore/ValueStore.cs +++ b/src/Avalonia.Base/PropertyStore/ValueStore.cs @@ -610,8 +610,7 @@ namespace Avalonia.PropertyStore private int InsertFrame(ValueFrame frame) { - // Uncomment this line when #8549 is fixed. - //Debug.Assert(!_frames.Contains(frame)); + Debug.Assert(!_frames.Contains(frame)); var index = BinarySearchFrame(frame.Priority); _frames.Insert(index, frame); diff --git a/src/Avalonia.Controls/TopLevel.cs b/src/Avalonia.Controls/TopLevel.cs index 515535bf39..90af881adc 100644 --- a/src/Avalonia.Controls/TopLevel.cs +++ b/src/Avalonia.Controls/TopLevel.cs @@ -182,8 +182,6 @@ namespace Avalonia.Controls _globalStyles.GlobalStylesRemoved += ((IStyleHost)this).StylesRemoved; } - ApplyStyling(); - ClientSize = impl.ClientSize; FrameSize = impl.FrameSize; diff --git a/src/Avalonia.Controls/Window.cs b/src/Avalonia.Controls/Window.cs index 1a7dca737e..559d674c02 100644 --- a/src/Avalonia.Controls/Window.cs +++ b/src/Avalonia.Controls/Window.cs @@ -647,6 +647,7 @@ namespace Avalonia.Controls RaiseEvent(new RoutedEventArgs(WindowOpenedEvent)); EnsureInitialized(); + ApplyStyling(); IsVisible = true; var initialSize = new Size( @@ -726,6 +727,7 @@ namespace Avalonia.Controls RaiseEvent(new RoutedEventArgs(WindowOpenedEvent)); EnsureInitialized(); + ApplyStyling(); IsVisible = true; var initialSize = new Size( diff --git a/src/Avalonia.Controls/WindowBase.cs b/src/Avalonia.Controls/WindowBase.cs index 89483cd566..8f1b2198ad 100644 --- a/src/Avalonia.Controls/WindowBase.cs +++ b/src/Avalonia.Controls/WindowBase.cs @@ -149,6 +149,7 @@ namespace Avalonia.Controls try { EnsureInitialized(); + ApplyStyling(); IsVisible = true; if (!_hasExecutedInitialLayoutPass) diff --git a/tests/Avalonia.Controls.UnitTests/AutoCompleteBoxTests.cs b/tests/Avalonia.Controls.UnitTests/AutoCompleteBoxTests.cs index c8bd289e54..9d71e3bffc 100644 --- a/tests/Avalonia.Controls.UnitTests/AutoCompleteBoxTests.cs +++ b/tests/Avalonia.Controls.UnitTests/AutoCompleteBoxTests.cs @@ -1056,6 +1056,7 @@ namespace Avalonia.Controls.UnitTests control.Items = CreateSimpleStringArray(); TextBox textBox = GetTextBox(control); var window = new Window {Content = control}; + window.ApplyStyling(); window.ApplyTemplate(); window.Presenter.ApplyTemplate(); Dispatcher.UIThread.RunJobs(); diff --git a/tests/Avalonia.Controls.UnitTests/ContextMenuTests.cs b/tests/Avalonia.Controls.UnitTests/ContextMenuTests.cs index b63cbd286e..a798801f20 100644 --- a/tests/Avalonia.Controls.UnitTests/ContextMenuTests.cs +++ b/tests/Avalonia.Controls.UnitTests/ContextMenuTests.cs @@ -29,6 +29,7 @@ namespace Avalonia.Controls.UnitTests }; var window = new Window { Content = target }; + window.ApplyStyling(); window.ApplyTemplate(); window.Presenter.ApplyTemplate(); @@ -61,6 +62,7 @@ namespace Avalonia.Controls.UnitTests }; var window = new Window { Content = target }; + window.ApplyStyling(); window.ApplyTemplate(); window.Presenter.ApplyTemplate(); @@ -130,6 +132,7 @@ namespace Avalonia.Controls.UnitTests }; var window = new Window { Content = target }; + window.ApplyStyling(); window.ApplyTemplate(); window.Presenter.ApplyTemplate(); @@ -158,6 +161,7 @@ namespace Avalonia.Controls.UnitTests }; var window = new Window { Content = target }; + window.ApplyStyling(); window.ApplyTemplate(); window.Presenter.ApplyTemplate(); @@ -186,6 +190,7 @@ namespace Avalonia.Controls.UnitTests }; var window = new Window { Content = target }; + window.ApplyStyling(); window.ApplyTemplate(); window.Presenter.ApplyTemplate(); @@ -207,6 +212,7 @@ namespace Avalonia.Controls.UnitTests }; var window = new Window { Content = target }; + window.ApplyStyling(); window.ApplyTemplate(); window.Presenter.ApplyTemplate(); @@ -390,7 +396,8 @@ namespace Avalonia.Controls.UnitTests var sp = new StackPanel { Children = { target1, target2 } }; var window = new Window { Content = sp }; - + + window.ApplyStyling(); window.ApplyTemplate(); window.Presenter.ApplyTemplate(); @@ -594,6 +601,7 @@ namespace Avalonia.Controls.UnitTests windowImpl.Setup(x => x.CreateRenderer(It.IsAny())).Returns(renderer.Object); var w = new Window(windowImpl.Object) { Content = content }; + w.ApplyStyling(); w.ApplyTemplate(); w.Presenter.ApplyTemplate(); return w; diff --git a/tests/Avalonia.Controls.UnitTests/MenuItemTests.cs b/tests/Avalonia.Controls.UnitTests/MenuItemTests.cs index d25a790fde..c19a01facb 100644 --- a/tests/Avalonia.Controls.UnitTests/MenuItemTests.cs +++ b/tests/Avalonia.Controls.UnitTests/MenuItemTests.cs @@ -193,6 +193,7 @@ namespace Avalonia.Controls.UnitTests var target = new MenuItem(); var contextMenu = new ContextMenu { Items = new AvaloniaList { target } }; var window = new Window { Content = new Panel { ContextMenu = contextMenu } }; + window.ApplyStyling(); window.ApplyTemplate(); window.Presenter.ApplyTemplate(); @@ -232,6 +233,7 @@ namespace Avalonia.Controls.UnitTests var flyout = new MenuFlyout { Items = new AvaloniaList { target } }; var button = new Button { Flyout = flyout }; var window = new Window { Content = button }; + window.ApplyStyling(); window.ApplyTemplate(); window.Presenter.ApplyTemplate(); @@ -271,6 +273,7 @@ namespace Avalonia.Controls.UnitTests var parentMenuItem = new MenuItem { Items = new AvaloniaList { target } }; var contextMenu = new ContextMenu { Items = new AvaloniaList { parentMenuItem } }; var window = new Window { Content = new Panel { ContextMenu = contextMenu } }; + window.ApplyStyling(); window.ApplyTemplate(); window.Presenter.ApplyTemplate(); contextMenu.Open(); diff --git a/tests/Avalonia.Controls.UnitTests/NumericUpDownTests.cs b/tests/Avalonia.Controls.UnitTests/NumericUpDownTests.cs index 4cef7e4d05..d50faf8be9 100644 --- a/tests/Avalonia.Controls.UnitTests/NumericUpDownTests.cs +++ b/tests/Avalonia.Controls.UnitTests/NumericUpDownTests.cs @@ -50,6 +50,7 @@ namespace Avalonia.Controls.UnitTests var control = CreateControl(); TextBox textBox = GetTextBox(control); var window = new Window { Content = control }; + window.ApplyStyling(); window.ApplyTemplate(); window.Presenter.ApplyTemplate(); Dispatcher.UIThread.RunJobs(); diff --git a/tests/Avalonia.Controls.UnitTests/Primitives/PopupRootTests.cs b/tests/Avalonia.Controls.UnitTests/Primitives/PopupRootTests.cs index 6d3351d2b2..f283681088 100644 --- a/tests/Avalonia.Controls.UnitTests/Primitives/PopupRootTests.cs +++ b/tests/Avalonia.Controls.UnitTests/Primitives/PopupRootTests.cs @@ -51,6 +51,7 @@ namespace Avalonia.Controls.UnitTests.Primitives }; window.Content = target; + window.ApplyStyling(); window.ApplyTemplate(); window.Presenter.ApplyTemplate(); target.ApplyTemplate(); @@ -177,6 +178,7 @@ namespace Avalonia.Controls.UnitTests.Primitives }; window.Content = target; + window.ApplyStyling(); window.ApplyTemplate(); window.Presenter.ApplyTemplate(); target.ApplyTemplate(); diff --git a/tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs b/tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs index 5f91f2e2a1..7e695612df 100644 --- a/tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs +++ b/tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs @@ -569,6 +569,7 @@ namespace Avalonia.Controls.UnitTests.Primitives windowImpl.Setup(x => x.CreateRenderer(It.IsAny())).Returns(renderer.Object); var window = new Window(windowImpl.Object); + window.ApplyStyling(); window.ApplyTemplate(); var target = new Popup() @@ -1090,6 +1091,7 @@ namespace Avalonia.Controls.UnitTests.Primitives private Window PreparedWindow(object content = null) { var w = new Window { Content = content }; + w.ApplyStyling(); w.ApplyTemplate(); return w; } diff --git a/tests/Avalonia.Controls.UnitTests/ToolTipTests.cs b/tests/Avalonia.Controls.UnitTests/ToolTipTests.cs index 25969a58e3..25f38f8665 100644 --- a/tests/Avalonia.Controls.UnitTests/ToolTipTests.cs +++ b/tests/Avalonia.Controls.UnitTests/ToolTipTests.cs @@ -51,6 +51,7 @@ namespace Avalonia.Controls.UnitTests window.Content = panel; + window.ApplyStyling(); window.ApplyTemplate(); window.Presenter.ApplyTemplate(); @@ -114,6 +115,7 @@ namespace Avalonia.Controls.UnitTests window.Content = target; + window.ApplyStyling(); window.ApplyTemplate(); window.Presenter.ApplyTemplate(); @@ -140,6 +142,7 @@ namespace Avalonia.Controls.UnitTests window.Content = target; + window.ApplyStyling(); window.ApplyTemplate(); window.Presenter.ApplyTemplate(); @@ -183,6 +186,7 @@ namespace Avalonia.Controls.UnitTests window.Content = target; + window.ApplyStyling(); window.ApplyTemplate(); window.Presenter.ApplyTemplate(); @@ -215,6 +219,7 @@ namespace Avalonia.Controls.UnitTests window.Content = decorator; + window.ApplyStyling(); window.ApplyTemplate(); window.Presenter.ApplyTemplate(); @@ -237,6 +242,7 @@ namespace Avalonia.Controls.UnitTests window.Content = decorator; + window.ApplyStyling(); window.ApplyTemplate(); window.Presenter.ApplyTemplate(); @@ -261,6 +267,7 @@ namespace Avalonia.Controls.UnitTests window.Content = decorator; + window.ApplyStyling(); window.ApplyTemplate(); window.Presenter.ApplyTemplate(); @@ -286,6 +293,7 @@ namespace Avalonia.Controls.UnitTests window.Content = target; + window.ApplyStyling(); window.ApplyTemplate(); window.Presenter.ApplyTemplate(); diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs index 2a2e5f2478..af133cca73 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs @@ -720,7 +720,12 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml //ensure binding is set and operational first Assert.Equal(100.0, tracker.Tag); - Assert.Equal("EndInit 0", tracker.Order.Last()); + // EndInit should be second-to-last operation, as last operation will be + // caused by styling being applied on EndInit. + Assert.Equal("EndInit 0", tracker.Order[tracker.Order.Count - 2]); + + // Caused by styling. + Assert.Equal("Property Foreground Changed", tracker.Order[tracker.Order.Count - 1]); } }