diff --git a/src/AtomUI.Controls/AtomUIOSSControlThemesProvider.axaml b/src/AtomUI.Controls/AtomUIOSSControlThemesProvider.axaml index 4cf74c944..2e16754fa 100644 --- a/src/AtomUI.Controls/AtomUIOSSControlThemesProvider.axaml +++ b/src/AtomUI.Controls/AtomUIOSSControlThemesProvider.axaml @@ -49,7 +49,7 @@ - + diff --git a/src/AtomUI.Controls/Buttons/Button.cs b/src/AtomUI.Controls/Buttons/Button.cs index 8bf888377..d66b8d976 100644 --- a/src/AtomUI.Controls/Buttons/Button.cs +++ b/src/AtomUI.Controls/Buttons/Button.cs @@ -290,11 +290,11 @@ public class Button : AvaloniaButton, } if (e.Property == ButtonTypeProperty) { - SetupControlThemeBindings(true); + ConfigureControlThemeBindings(true); } } - protected virtual void SetupControlThemeBindings(bool force = false) + protected virtual void ConfigureControlThemeBindings(bool force) { if (!ThemeConfigured || force) { @@ -335,7 +335,7 @@ public class Button : AvaloniaButton, public override void EndInit() { - SetupControlThemeBindings(); + ConfigureControlThemeBindings(false); base.EndInit(); } diff --git a/src/AtomUI.Controls/Buttons/DropdownButton.cs b/src/AtomUI.Controls/Buttons/DropdownButton.cs index c18405cf6..79990dcd9 100644 --- a/src/AtomUI.Controls/Buttons/DropdownButton.cs +++ b/src/AtomUI.Controls/Buttons/DropdownButton.cs @@ -146,7 +146,7 @@ public class DropdownButton : Button _flyoutStateHelper.ClickHideFlyoutPredicate = ClickHideFlyoutPredicate; } - protected override void SetupControlThemeBindings(bool force = false) + protected override void ConfigureControlThemeBindings(bool force) { if (!ThemeConfigured || force) { diff --git a/src/AtomUI.Controls/NavMenu/NavMenu.cs b/src/AtomUI.Controls/NavMenu/NavMenu.cs index f613ee39e..ded2d3a07 100644 --- a/src/AtomUI.Controls/NavMenu/NavMenu.cs +++ b/src/AtomUI.Controls/NavMenu/NavMenu.cs @@ -1,5 +1,4 @@ using System.Reactive.Disposables; -using AtomUI.Animations; using AtomUI.Controls.Themes; using AtomUI.Data; using AtomUI.Theme; @@ -103,13 +102,12 @@ public class NavMenu : NavMenuBase, IResourceBindingManager internal static readonly StyledProperty HorizontalBorderThicknessProperty = AvaloniaProperty.Register(nameof(HorizontalBorderThickness)); - internal double HorizontalBorderThickness + public double HorizontalBorderThickness { get => GetValue(HorizontalBorderThicknessProperty); set => SetValue(HorizontalBorderThicknessProperty, value); } - CompositeDisposable? IResourceBindingManager.ResourceBindingsDisposable { get; set; } #endregion private static readonly FuncTemplate DefaultPanel = @@ -128,6 +126,8 @@ public class NavMenu : NavMenuBase, IResourceBindingManager private ItemsPresenter? _menuItemsPresenter; + CompositeDisposable? IResourceBindingManager.ResourceBindingsDisposable { get; set; } + public NavMenu() { UpdatePseudoClasses(); @@ -169,13 +169,6 @@ public class NavMenu : NavMenuBase, IResourceBindingManager Source = this, }); } - - public override void EndInit() - { - ConfigureControlTheme(); - ConfigureItemContainerTheme(); - base.EndInit(); - } protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) { @@ -187,77 +180,24 @@ public class NavMenu : NavMenuBase, IResourceBindingManager UpdatePseudoClasses(); } + if (change.Property == ModeProperty) + { + ConfigureControlTheme(true); + ConfigureItemContainerTheme(true); + } + if (this.IsAttachedToVisualTree()) { if (change.Property == ModeProperty) { - ConfigureControlTheme(true); HandleModeChanged(); } } } - private void ConfigureControlTheme(bool force = false) - { - string? resourceKey = null; - if (Theme == null || force) - { - if (Mode == NavMenuMode.Horizontal) - { - resourceKey = NavMenuThemeConstants.HorizontalNavMenuThemeId; - } - else - { - resourceKey = NavMenuThemeConstants.VerticalNavMenuThemeId; - } - if (Application.Current != null) - { - if (Application.Current.TryFindResource(resourceKey, out var resource)) - { - if (resource is ControlTheme theme) - { - Theme = theme; - } - } - } - } - } - - private void ConfigureItemContainerTheme(bool force = false) - { - if (ItemContainerTheme is null || force) - { - string resourceKey; - if (Mode == NavMenuMode.Vertical) - { - resourceKey = NavMenuThemeConstants.VerticalNavMenuItemThemeId; - } - else if (Mode == NavMenuMode.Inline) - { - resourceKey = NavMenuThemeConstants.InlineNavMenuItemThemeId; - } - else - { - resourceKey = NavMenuThemeConstants.TopLevelHorizontalNavMenuItemThemeId; - } - - if (Application.Current != null) - { - if (Application.Current.TryFindResource(resourceKey, out var resource)) - { - if (resource is ControlTheme theme) - { - ItemContainerTheme = theme; - } - } - } - } - } - private void HandleModeChanged() { CloseChildItemsRecursively(); - ConfigureItemContainerTheme(true); RegenerateContainersRecursively(); SetupMenuItemsPresenter(); SetupInteractionHandler(true); @@ -314,6 +254,13 @@ public class NavMenu : NavMenuBase, IResourceBindingManager PseudoClasses.Set(NavMenuPseudoClass.DarkStyle, IsDarkStyle); PseudoClasses.Set(NavMenuPseudoClass.LightStyle, !IsDarkStyle); } + + public override void EndInit() + { + ConfigureControlTheme(false); + ConfigureItemContainerTheme(false); + base.EndInit(); + } protected override void OnAttachedToLogicalTree(LogicalTreeAttachmentEventArgs e) { @@ -364,6 +311,63 @@ public class NavMenu : NavMenuBase, IResourceBindingManager InteractionHandler?.Attach(this); } } + + private void ConfigureControlTheme(bool force) + { + string? resourceKey = null; + if (Theme == null || force) + { + if (Mode == NavMenuMode.Horizontal) + { + resourceKey = NavMenuThemeConstants.HorizontalNavMenuThemeId; + } + else + { + resourceKey = NavMenuThemeConstants.VerticalNavMenuThemeId; + } + if (Application.Current != null) + { + if (Application.Current.TryFindResource(resourceKey, out var resource)) + { + if (resource is ControlTheme theme) + { + Theme = theme; + } + } + } + } + } + + private void ConfigureItemContainerTheme(bool force) + { + if (ItemContainerTheme is null || force) + { + string resourceKey; + if (Mode == NavMenuMode.Vertical) + { + resourceKey = NavMenuThemeConstants.VerticalNavMenuItemThemeId; + } + else if (Mode == NavMenuMode.Inline) + { + resourceKey = NavMenuThemeConstants.InlineNavMenuItemThemeId; + } + else + { + resourceKey = NavMenuThemeConstants.TopLevelHorizontalNavMenuItemThemeId; + } + + if (Application.Current != null) + { + if (Application.Current.TryFindResource(resourceKey, out var resource)) + { + if (resource is ControlTheme theme) + { + ItemContainerTheme = theme; + } + } + } + } + } internal void ClearSelection() { @@ -371,9 +375,7 @@ public class NavMenu : NavMenuBase, IResourceBindingManager { if (item is NavMenuItem navMenuItem) { - navMenuItem.DisableAllTransitions(); ClearSelectionRecursively(navMenuItem); - navMenuItem.EnableAllTransitions(); } } } @@ -449,5 +451,6 @@ public class NavMenu : NavMenuBase, IResourceBindingManager base.OnApplyTemplate(e); _menuItemsPresenter = e.NameScope.Find(NavMenuThemeConstants.ItemsPresenterPart); SetupMenuItemsPresenter(); + HandleModeChanged(); } } \ No newline at end of file