diff --git a/src/Avalonia.Controls/Application.cs b/src/Avalonia.Controls/Application.cs index 3d13608226..6237a859a9 100644 --- a/src/Avalonia.Controls/Application.cs +++ b/src/Avalonia.Controls/Application.cs @@ -39,6 +39,7 @@ namespace Avalonia private readonly Lazy _clipboard = new Lazy(() => (IClipboard)AvaloniaLocator.Current.GetService(typeof(IClipboard))); private readonly Styler _styler = new Styler(); + private Styles _styles; /// /// Initializes a new instance of the class. @@ -109,13 +110,16 @@ namespace Avalonia /// /// Global styles apply to all windows in the application. /// - public Styles Styles { get; } = new Styles(); + public Styles Styles => _styles ?? (_styles = new Styles()); /// /// Gets the styling parent of the application, which is null. /// IStyleHost IStyleHost.StylingParent => null; + /// + bool IStyleHost.IsStylesInitialized => _styles != null; + /// /// Initializes the application by loading XAML etc. /// diff --git a/src/Avalonia.Controls/Control.cs b/src/Avalonia.Controls/Control.cs index eca5967a58..83c66d6349 100644 --- a/src/Avalonia.Controls/Control.cs +++ b/src/Avalonia.Controls/Control.cs @@ -97,8 +97,8 @@ namespace Avalonia.Controls private bool _isAttachedToLogicalTree; private IAvaloniaList _logicalChildren; private INameScope _nameScope; - private Styles _styles; private bool _styled; + private Styles _styles; private Subject _styleDetach = new Subject(); /// @@ -259,18 +259,14 @@ namespace Avalonia.Controls public bool IsInitialized { get; private set; } /// - /// Gets or sets the styles for the control. + /// Gets the styles for the control. /// /// /// Styles for the entire application are added to the Application.Styles collection, but /// each control may in addition define its own styles which are applied to the control /// itself and its children. /// - public Styles Styles - { - get { return _styles ?? (_styles = new Styles()); } - set { _styles = value; } - } + public Styles Styles => _styles ?? (_styles = new Styles()); /// /// Gets the control's logical parent. @@ -336,6 +332,9 @@ namespace Avalonia.Controls /// IObservable IStyleable.StyleDetach => _styleDetach; + /// + bool IStyleHost.IsStylesInitialized => _styles != null; + /// IStyleHost IStyleHost.StylingParent => (IStyleHost)InheritanceParent; diff --git a/src/Avalonia.Diagnostics/Views/ControlDetailsView.cs b/src/Avalonia.Diagnostics/Views/ControlDetailsView.cs index d7bd6fd128..e58818d31d 100644 --- a/src/Avalonia.Diagnostics/Views/ControlDetailsView.cs +++ b/src/Avalonia.Diagnostics/Views/ControlDetailsView.cs @@ -42,7 +42,7 @@ namespace Avalonia.Diagnostics.Views { Content = _grid = new SimpleGrid { - Styles = new Styles + Styles = { new Style(x => x.Is()) { diff --git a/src/Avalonia.Styling/Styling/IStyleHost.cs b/src/Avalonia.Styling/Styling/IStyleHost.cs index 8422f18b46..b225419c2d 100644 --- a/src/Avalonia.Styling/Styling/IStyleHost.cs +++ b/src/Avalonia.Styling/Styling/IStyleHost.cs @@ -1,6 +1,8 @@ // Copyright (c) The Avalonia Project. All rights reserved. // Licensed under the MIT license. See licence.md file in the project root for full license information. +using System; + namespace Avalonia.Styling { /// @@ -8,6 +10,15 @@ namespace Avalonia.Styling /// public interface IStyleHost { + /// + /// Gets a value indicating whether is initialized. + /// + /// + /// The property may be lazily initialized, if so this property + /// indicates whether it has been initialized. + /// + bool IsStylesInitialized { get; } + /// /// Gets the styles for the element. /// @@ -17,6 +28,5 @@ namespace Avalonia.Styling /// Gets the parent style host element. /// IStyleHost StylingParent { get; } - } } diff --git a/src/Avalonia.Styling/Styling/StyleExtensions.cs b/src/Avalonia.Styling/Styling/StyleExtensions.cs index e1073335a0..d53d00aed3 100644 --- a/src/Avalonia.Styling/Styling/StyleExtensions.cs +++ b/src/Avalonia.Styling/Styling/StyleExtensions.cs @@ -23,11 +23,14 @@ namespace Avalonia.Styling while (control != null) { - var result = control.Styles.FindResource(name); - - if (result != AvaloniaProperty.UnsetValue) + if (control.IsStylesInitialized) { - return result; + var result = control.Styles.FindResource(name); + + if (result != AvaloniaProperty.UnsetValue) + { + return result; + } } control = control.StylingParent; diff --git a/src/Avalonia.Styling/Styling/Styler.cs b/src/Avalonia.Styling/Styling/Styler.cs index 880e435b58..7ac5c89005 100644 --- a/src/Avalonia.Styling/Styling/Styler.cs +++ b/src/Avalonia.Styling/Styling/Styler.cs @@ -29,7 +29,10 @@ namespace Avalonia.Styling ApplyStyles(control, parentContainer); } - styleHost.Styles.Attach(control, styleHost); + if (styleHost.IsStylesInitialized) + { + styleHost.Styles.Attach(control, styleHost); + } } } } diff --git a/tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs b/tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs index f192e87f08..ccbf04533d 100644 --- a/tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs +++ b/tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs @@ -265,6 +265,7 @@ namespace Avalonia.Controls.UnitTests.Primitives }; var globalStyles = new Mock(); + globalStyles.Setup(x => x.IsStylesInitialized).Returns(true); globalStyles.Setup(x => x.Styles).Returns(styles); var renderInterface = new Mock(); diff --git a/tests/Avalonia.Controls.UnitTests/Primitives/TemplatedControlTests.cs b/tests/Avalonia.Controls.UnitTests/Primitives/TemplatedControlTests.cs index 72c8073f21..be3c34ac2e 100644 --- a/tests/Avalonia.Controls.UnitTests/Primitives/TemplatedControlTests.cs +++ b/tests/Avalonia.Controls.UnitTests/Primitives/TemplatedControlTests.cs @@ -399,7 +399,7 @@ namespace Avalonia.Controls.UnitTests.Primitives TestTemplatedControl target; var root = new TestRoot { - Styles = new Styles + Styles = { new Style(x => x.OfType()) { @@ -435,7 +435,7 @@ namespace Avalonia.Controls.UnitTests.Primitives TestTemplatedControl target; var root = new TestRoot { - Styles = new Styles + Styles = { new Style(x => x.OfType()) { @@ -474,7 +474,7 @@ namespace Avalonia.Controls.UnitTests.Primitives var root = new TestRoot { - Styles = new Styles + Styles = { new Style(x => x.OfType()) { @@ -494,7 +494,7 @@ namespace Avalonia.Controls.UnitTests.Primitives var root2 = new TestRoot { - Styles = new Styles + Styles = { new Style(x => x.OfType()) { diff --git a/tests/Avalonia.Controls.UnitTests/TabControlTests.cs b/tests/Avalonia.Controls.UnitTests/TabControlTests.cs index 2bbd08bf42..d11c989261 100644 --- a/tests/Avalonia.Controls.UnitTests/TabControlTests.cs +++ b/tests/Avalonia.Controls.UnitTests/TabControlTests.cs @@ -135,7 +135,7 @@ namespace Avalonia.Controls.UnitTests { var root = new TestRoot { - Styles = new Styles + Styles = { new Style(x => x.OfType()) { diff --git a/tests/Avalonia.Controls.UnitTests/UserControlTests.cs b/tests/Avalonia.Controls.UnitTests/UserControlTests.cs index c74ffab223..738c54594e 100644 --- a/tests/Avalonia.Controls.UnitTests/UserControlTests.cs +++ b/tests/Avalonia.Controls.UnitTests/UserControlTests.cs @@ -21,7 +21,7 @@ namespace Avalonia.Controls.UnitTests var target = new UserControl(); var root = new TestRoot { - Styles = new Styles + Styles = { new Style(x => x.OfType()) { diff --git a/tests/Avalonia.Layout.UnitTests/FullLayoutTests.cs b/tests/Avalonia.Layout.UnitTests/FullLayoutTests.cs index 6b7c73da2a..cdfb253bf4 100644 --- a/tests/Avalonia.Layout.UnitTests/FullLayoutTests.cs +++ b/tests/Avalonia.Layout.UnitTests/FullLayoutTests.cs @@ -193,6 +193,7 @@ namespace Avalonia.Layout.UnitTests .Bind().ToConstant(new Avalonia.Controls.UnitTests.WindowingPlatformMock(() => windowImpl.Object)); var theme = new DefaultTheme(); + globalStyles.Setup(x => x.IsStylesInitialized).Returns(true); globalStyles.Setup(x => x.Styles).Returns(theme); } } diff --git a/tests/Avalonia.Styling.UnitTests/ResourceTests.cs b/tests/Avalonia.Styling.UnitTests/ResourceTests.cs index a2535e0fb5..1f9b925eb1 100644 --- a/tests/Avalonia.Styling.UnitTests/ResourceTests.cs +++ b/tests/Avalonia.Styling.UnitTests/ResourceTests.cs @@ -16,7 +16,7 @@ namespace Avalonia.Styling.UnitTests var tree = new Decorator { - Styles = new Styles + Styles = { new Style { @@ -29,7 +29,7 @@ namespace Avalonia.Styling.UnitTests }, Child = target = new Border { - Styles = new Styles + Styles = { new Style { @@ -60,16 +60,16 @@ namespace Avalonia.Styling.UnitTests var tree = target = new Border { - Styles = new Styles + Styles = + { + new Style { - new Style + Resources = new StyleResources { - Resources = new StyleResources - { - { "Foo", "foo" }, - } - }, - } + { "Foo", "foo" }, + } + }, + } }; Assert.Equal(AvaloniaProperty.UnsetValue, target.FindStyleResource("Baz"));