diff --git a/src/AtomUI.Controls/NavMenu/BaseNavMenuItemTheme.cs b/src/AtomUI.Controls/NavMenu/BaseNavMenuItemTheme.cs index afa529aba..9c73063f1 100644 --- a/src/AtomUI.Controls/NavMenu/BaseNavMenuItemTheme.cs +++ b/src/AtomUI.Controls/NavMenu/BaseNavMenuItemTheme.cs @@ -34,12 +34,12 @@ internal class BaseNavMenuItemTheme : BaseControlTheme protected override IControlTemplate BuildControlTemplate() { - return new FuncControlTemplate((item, scope) => + return new FuncControlTemplate((navMenuItem, scope) => { // 仅仅为了把 Popup 包进来,没有其他什么作用 var layoutWrapper = new Panel(); - var header = BuildMenuItemContent(item, scope); - BuildExtraItem(layoutWrapper, scope); + var header = BuildMenuItemContent(navMenuItem, scope); + BuildExtraItem(navMenuItem, layoutWrapper, scope); layoutWrapper.Children.Add(header); return layoutWrapper; }); @@ -90,12 +90,15 @@ internal class BaseNavMenuItemTheme : BaseControlTheme Grid.SetColumn(iconPresenter, 0); iconPresenter.RegisterInNameScope(scope); CreateTemplateParentBinding(iconPresenter, ContentPresenter.ContentProperty, NavMenuItem.IconProperty); - TokenResourceBinder.CreateTokenBinding(iconPresenter, Layoutable.MarginProperty, - NavMenuTokenKey.ItemMargin); - TokenResourceBinder.CreateTokenBinding(iconPresenter, Layoutable.WidthProperty, - NavMenuTokenKey.ItemIconSize); - TokenResourceBinder.CreateTokenBinding(iconPresenter, Layoutable.HeightProperty, - NavMenuTokenKey.ItemIconSize); + navMenuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(iconPresenter, + Layoutable.MarginProperty, + NavMenuTokenKey.ItemMargin)); + navMenuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(iconPresenter, + Layoutable.WidthProperty, + NavMenuTokenKey.ItemIconSize)); + navMenuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(iconPresenter, + Layoutable.HeightProperty, + NavMenuTokenKey.ItemIconSize)); var itemTextPresenter = new ContentPresenter { @@ -106,8 +109,9 @@ internal class BaseNavMenuItemTheme : BaseControlTheme IsHitTestVisible = false }; Grid.SetColumn(itemTextPresenter, 1); - TokenResourceBinder.CreateTokenBinding(itemTextPresenter, Layoutable.MarginProperty, - NavMenuTokenKey.ItemMargin); + navMenuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(itemTextPresenter, + Layoutable.MarginProperty, + NavMenuTokenKey.ItemMargin)); CreateTemplateParentBinding(itemTextPresenter, ContentPresenter.ContentProperty, HeaderedSelectingItemsControl.HeaderProperty); CreateTemplateParentBinding(itemTextPresenter, ContentPresenter.ContentTemplateProperty, @@ -123,8 +127,9 @@ internal class BaseNavMenuItemTheme : BaseControlTheme VerticalAlignment = VerticalAlignment.Center }; Grid.SetColumn(inputGestureText, 2); - TokenResourceBinder.CreateTokenBinding(inputGestureText, Layoutable.MarginProperty, - NavMenuTokenKey.ItemMargin); + navMenuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(inputGestureText, + Layoutable.MarginProperty, + NavMenuTokenKey.ItemMargin)); CreateTemplateParentBinding(inputGestureText, SingleLineText.TextProperty, NavMenuItem.InputGestureProperty, @@ -133,7 +138,7 @@ internal class BaseNavMenuItemTheme : BaseControlTheme inputGestureText.RegisterInNameScope(scope); - var menuIndicatorIcon = BuildMenuIndicatorIcon(scope); + var menuIndicatorIcon = BuildMenuIndicatorIcon(navMenuItem, scope); Grid.SetColumn(menuIndicatorIcon, 3); layout.Children.Add(iconPresenter); @@ -143,11 +148,11 @@ internal class BaseNavMenuItemTheme : BaseControlTheme return layout; } - protected virtual void BuildExtraItem(Panel layout, INameScope scope) + protected virtual void BuildExtraItem(NavMenuItem navMenuItem, Panel layout, INameScope scope) { } - protected virtual Control BuildMenuIndicatorIcon(INameScope scope) + protected virtual Control BuildMenuIndicatorIcon(NavMenuItem navMenuItem, INameScope scope) { var menuIndicatorIcon = AntDesignIconPackage.RightOutlined(); menuIndicatorIcon.Name = MenuIndicatorIconPart; @@ -156,10 +161,12 @@ internal class BaseNavMenuItemTheme : BaseControlTheme CreateTemplateParentBinding(menuIndicatorIcon, Icon.IsEnabledProperty, NavMenuItem.IsEnabledProperty); - TokenResourceBinder.CreateTokenBinding(menuIndicatorIcon, Layoutable.WidthProperty, - NavMenuTokenKey.MenuArrowSize); - TokenResourceBinder.CreateTokenBinding(menuIndicatorIcon, Layoutable.HeightProperty, - NavMenuTokenKey.MenuArrowSize); + navMenuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(menuIndicatorIcon, + Layoutable.WidthProperty, + NavMenuTokenKey.MenuArrowSize)); + navMenuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(menuIndicatorIcon, + Layoutable.HeightProperty, + NavMenuTokenKey.MenuArrowSize)); menuIndicatorIcon.RegisterInNameScope(scope); return menuIndicatorIcon; diff --git a/src/AtomUI.Controls/NavMenu/HorizontalNavMenuTheme.cs b/src/AtomUI.Controls/NavMenu/HorizontalNavMenuTheme.cs index 8b5a0cc8d..3eaa97c68 100644 --- a/src/AtomUI.Controls/NavMenu/HorizontalNavMenuTheme.cs +++ b/src/AtomUI.Controls/NavMenu/HorizontalNavMenuTheme.cs @@ -1,4 +1,5 @@ -using AtomUI.Theme.Data; +using AtomUI.Theme; +using AtomUI.Theme.Data; using AtomUI.Theme.Styling; using Avalonia.Controls; using Avalonia.Controls.Presenters; @@ -35,8 +36,8 @@ internal class HorizontalNavMenuTheme : BaseNavMenuTheme DockPanel.SetDock(horizontalLine, Dock.Bottom); CreateTemplateParentBinding(horizontalLine, Rectangle.HeightProperty, NavMenu.HorizontalBorderThicknessProperty); - TokenResourceBinder.CreateTokenBinding(horizontalLine, Rectangle.FillProperty, - SharedTokenKey.ColorBorderSecondary); + navMenu.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(horizontalLine, Rectangle.FillProperty, + SharedTokenKey.ColorBorderSecondary)); layout.Children.Add(BuildItemPresenter(true, scope)); return layout; diff --git a/src/AtomUI.Controls/NavMenu/InlineNavMenuItemTheme.cs b/src/AtomUI.Controls/NavMenu/InlineNavMenuItemTheme.cs index 90252b2b4..51bb88944 100644 --- a/src/AtomUI.Controls/NavMenu/InlineNavMenuItemTheme.cs +++ b/src/AtomUI.Controls/NavMenu/InlineNavMenuItemTheme.cs @@ -1,4 +1,5 @@ using AtomUI.MotionScene; +using AtomUI.Theme; using AtomUI.Theme.Data; using AtomUI.Theme.Styling; using AtomUI.Utils; @@ -33,9 +34,9 @@ internal class InlineNavMenuItemTheme : BaseNavMenuItemTheme return ID; } - protected override Control BuildMenuIndicatorIcon(INameScope scope) + protected override Control BuildMenuIndicatorIcon(NavMenuItem navMenuItem, INameScope scope) { - var indicatorIcon = base.BuildMenuIndicatorIcon(scope); + var indicatorIcon = base.BuildMenuIndicatorIcon(navMenuItem, scope); var menuIndicatorIconPresenter = new Border() { Name = MenuIndicatorIconLayoutPart @@ -58,7 +59,8 @@ internal class InlineNavMenuItemTheme : BaseNavMenuItemTheme { Name = ChildItemsLayoutTransformPart, }; - TokenResourceBinder.CreateTokenBinding(childItemsLayoutTransform, MotionActorControl.MarginProperty, + navMenuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(childItemsLayoutTransform, + MotionActorControl.MarginProperty, NavMenuTokenKey.VerticalItemsPanelSpacing, BindingPriority.Template, (v) => { @@ -68,7 +70,7 @@ internal class InlineNavMenuItemTheme : BaseNavMenuItemTheme } return new Thickness(); - }); + })); childItemsLayoutTransform.RegisterInNameScope(scope); var itemsPresenter = new ItemsPresenter @@ -95,7 +97,7 @@ internal class InlineNavMenuItemTheme : BaseNavMenuItemTheme Indent = navMenuItem.InlineItemIndentUnit }; CreateTemplateParentBinding(infoGrid, Grid.MarginProperty, - NavMenuItem.LevelProperty, + NavMenuItem.LevelProperty, BindingMode.OneWay, indentConverter); @@ -117,20 +119,23 @@ internal class InlineNavMenuItemTheme : BaseNavMenuItemTheme { { // 动画设置 - var isMotionEnabledStyle = new Style(selector => selector.Nesting().PropertyEquals(NavMenuItem.IsMotionEnabledProperty, true)); + var isMotionEnabledStyle = new Style(selector => + selector.Nesting().PropertyEquals(NavMenuItem.IsMotionEnabledProperty, true)); var menuIndicatorStyle = new Style(selector => selector.Nesting().Template().Name(MenuIndicatorIconLayoutPart)); - menuIndicatorStyle.Add(Border.TransitionsProperty, new SetterValueFactory(() => new Transitions() - { - AnimationUtils.CreateTransition(ContentPresenter.RenderTransformProperty) - })); + menuIndicatorStyle.Add(Border.TransitionsProperty, new SetterValueFactory(() => + new Transitions + { + AnimationUtils.CreateTransition(ContentPresenter + .RenderTransformProperty) + })); isMotionEnabledStyle.Add(menuIndicatorStyle); Add(isMotionEnabledStyle); } { var menuIndicatorStyle = new Style(selector => selector.Nesting().Template().Name(MenuIndicatorIconLayoutPart)); - + menuIndicatorStyle.Add(Border.RenderTransformProperty, new SetterValueFactory(() => { var transformOptions = new TransformOperations.Builder(1); @@ -144,7 +149,7 @@ internal class InlineNavMenuItemTheme : BaseNavMenuItemTheme { var menuIndicatorStyle = new Style(selector => selector.Nesting().Template().Name(MenuIndicatorIconLayoutPart)); - + menuIndicatorStyle.Add(Border.RenderTransformProperty, new SetterValueFactory(() => { var transformOptions = new TransformOperations.Builder(1); diff --git a/src/AtomUI.Controls/NavMenu/NavMenuItem.cs b/src/AtomUI.Controls/NavMenu/NavMenuItem.cs index 46f22d433..42e1ed017 100644 --- a/src/AtomUI.Controls/NavMenu/NavMenuItem.cs +++ b/src/AtomUI.Controls/NavMenu/NavMenuItem.cs @@ -1,10 +1,12 @@ -using System.Windows.Input; +using System.Reactive.Disposables; +using System.Windows.Input; using AtomUI.Controls.Utils; using AtomUI.Data; using AtomUI.IconPkg; using AtomUI.Input; using AtomUI.Media; using AtomUI.MotionScene; +using AtomUI.Theme; using AtomUI.Theme.Data; using AtomUI.Theme.Styling; using Avalonia; @@ -32,7 +34,8 @@ public class NavMenuItem : HeaderedSelectingItemsControl, ISelectable, ICommandSource, IClickableControl, - ICustomHitTest + ICustomHitTest, + ITokenResourceConsumer { public const string TopLevelPC = ":toplevel"; public const string SeparatorPC = ":separator"; @@ -370,6 +373,7 @@ public class NavMenuItem : HeaderedSelectingItemsControl, set => SetAndRaise(IsMotionEnabledProperty, ref _isMotionEnabled, value); } + CompositeDisposable? ITokenResourceConsumer.TokenBindingsDisposable => _tokenBindingsDisposable; #endregion #region 公共事件定义 @@ -466,13 +470,13 @@ public class NavMenuItem : HeaderedSelectingItemsControl, private static readonly FuncTemplate DefaultPanel = new(() => new StackPanel()); + private CompositeDisposable? _tokenBindingsDisposable; private bool _commandCanExecute = true; private bool _commandBindingError; private Popup? _popup; private KeyGesture? _hotkey; private bool _isEmbeddedInMenu; private Border? _horizontalFrame; - private IDisposable? _itemContainerThemeDisposable; private MotionActorControl? _childItemsLayoutTransform; private Border? _headerFrame; private bool _animating = false; @@ -571,6 +575,7 @@ public class NavMenuItem : HeaderedSelectingItemsControl, } base.OnAttachedToLogicalTree(e); + _tokenBindingsDisposable = new CompositeDisposable(); Level = CalculateDistanceFromLogicalParent(this) - 1; @@ -590,8 +595,10 @@ public class NavMenuItem : HeaderedSelectingItemsControl, } _isEmbeddedInMenu = parent?.FindLogicalAncestorOfType(true) != null; - TokenResourceBinder.CreateTokenBinding(this, InlineItemIndentUnitProperty, - NavMenuTokenKey.InlineItemIndentUnit); + this.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(this, InlineItemIndentUnitProperty, + NavMenuTokenKey.InlineItemIndentUnit)); + this.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(this, PopupMinWidthProperty, + NavMenuTokenKey.MenuPopupMinWidth)); } /// @@ -617,6 +624,7 @@ public class NavMenuItem : HeaderedSelectingItemsControl, { Command.CanExecuteChanged -= CanExecuteChangedHandler; } + this.DisposeTokenBindings(); } /// @@ -702,7 +710,7 @@ public class NavMenuItem : HeaderedSelectingItemsControl, } _horizontalFrame = e.NameScope.Find(TopLevelHorizontalNavMenuItemTheme.FramePart); - TokenResourceBinder.CreateTokenBinding(this, PopupMinWidthProperty, NavMenuTokenKey.MenuPopupMinWidth); + SetupItemIcon(); if (Mode == NavMenuMode.Inline) { @@ -713,8 +721,8 @@ public class NavMenuItem : HeaderedSelectingItemsControl, _childItemsLayoutTransform.SetCurrentValue(MotionActorControl.IsVisibleProperty, IsSubMenuOpen); } - TokenResourceBinder.CreateTokenBinding(this, OpenCloseMotionDurationProperty, - SharedTokenKey.MotionDurationSlow); + this.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(this, OpenCloseMotionDurationProperty, + SharedTokenKey.MotionDurationSlow)); } SetupTransitions(); } @@ -936,35 +944,35 @@ public class NavMenuItem : HeaderedSelectingItemsControl, private void SetupItemIcon() { - if (Icon is Icon menuItemIcon) + if (Icon is not null) { - BindUtils.RelayBind(this, IsEnabledProperty, menuItemIcon, Icon.IsEnabledProperty); - TokenResourceBinder.CreateTokenBinding(menuItemIcon, Icon.WidthProperty, - NavMenuTokenKey.ItemIconSize); - TokenResourceBinder.CreateTokenBinding(menuItemIcon, Icon.HeightProperty, - NavMenuTokenKey.ItemIconSize); + BindUtils.RelayBind(this, IsEnabledProperty, Icon, Icon.IsEnabledProperty); + this.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(Icon, Icon.WidthProperty, + NavMenuTokenKey.ItemIconSize)); + this.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(Icon, Icon.HeightProperty, + NavMenuTokenKey.ItemIconSize)); if (IsDarkStyle) { - TokenResourceBinder.CreateTokenBinding(menuItemIcon, Icon.NormalFilledBrushProperty, - NavMenuTokenKey.DarkItemColor); - TokenResourceBinder.CreateTokenBinding(menuItemIcon, Icon.SelectedFilledBrushProperty, - NavMenuTokenKey.DarkItemSelectedColor); - TokenResourceBinder.CreateTokenBinding(menuItemIcon, Icon.ActiveFilledBrushProperty, - NavMenuTokenKey.DarkItemHoverColor); - TokenResourceBinder.CreateTokenBinding(menuItemIcon, Icon.DisabledFilledBrushProperty, - NavMenuTokenKey.DarkItemDisabledColor); + this.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(Icon, Icon.NormalFilledBrushProperty, + NavMenuTokenKey.DarkItemColor)); + this.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(Icon, Icon.SelectedFilledBrushProperty, + NavMenuTokenKey.DarkItemSelectedColor)); + this.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(Icon, Icon.ActiveFilledBrushProperty, + NavMenuTokenKey.DarkItemHoverColor)); + this.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(Icon, Icon.DisabledFilledBrushProperty, + NavMenuTokenKey.DarkItemDisabledColor)); } else { - TokenResourceBinder.CreateTokenBinding(menuItemIcon, Icon.NormalFilledBrushProperty, - NavMenuTokenKey.ItemColor); - TokenResourceBinder.CreateTokenBinding(menuItemIcon, Icon.SelectedFilledBrushProperty, - NavMenuTokenKey.ItemSelectedColor); - TokenResourceBinder.CreateTokenBinding(menuItemIcon, Icon.ActiveFilledBrushProperty, - NavMenuTokenKey.ItemHoverColor); - TokenResourceBinder.CreateTokenBinding(menuItemIcon, Icon.DisabledFilledBrushProperty, - NavMenuTokenKey.ItemDisabledColor); + this.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(Icon, Icon.NormalFilledBrushProperty, + NavMenuTokenKey.ItemColor)); + this.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(Icon, Icon.SelectedFilledBrushProperty, + NavMenuTokenKey.ItemSelectedColor)); + this.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(Icon, Icon.ActiveFilledBrushProperty, + NavMenuTokenKey.ItemHoverColor)); + this.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(Icon, Icon.DisabledFilledBrushProperty, + NavMenuTokenKey.ItemDisabledColor)); } } } @@ -1237,12 +1245,10 @@ public class NavMenuItem : HeaderedSelectingItemsControl, { if (ItemContainerTheme is null || force) { - _itemContainerThemeDisposable?.Dispose(); if (Mode == NavMenuMode.Inline) { - _itemContainerThemeDisposable = - TokenResourceBinder.CreateTokenBinding(this, ItemContainerThemeProperty, - InlineNavMenuItemTheme.ID); + this.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(this, ItemContainerThemeProperty, + InlineNavMenuItemTheme.ID)); } } } diff --git a/src/AtomUI.Controls/NavMenu/NavMenuItemTheme.cs b/src/AtomUI.Controls/NavMenu/NavMenuItemTheme.cs index 017d3c05b..541ef182c 100644 --- a/src/AtomUI.Controls/NavMenu/NavMenuItemTheme.cs +++ b/src/AtomUI.Controls/NavMenu/NavMenuItemTheme.cs @@ -1,4 +1,5 @@ -using AtomUI.Theme.Data; +using AtomUI.Theme; +using AtomUI.Theme.Data; using AtomUI.Theme.Styling; using Avalonia.Controls; using Avalonia.Controls.Presenters; @@ -24,14 +25,14 @@ internal class NavMenuItemTheme : BaseNavMenuItemTheme { } - protected override void BuildExtraItem(Panel layout, INameScope scope) + protected override void BuildExtraItem(NavMenuItem navMenuItem, Panel layout, INameScope scope) { - var popup = CreateMenuPopup(); + var popup = CreateMenuPopup(navMenuItem); popup.RegisterInNameScope(scope); layout.Children.Add(popup); } - protected Popup CreateMenuPopup() + protected Popup CreateMenuPopup(NavMenuItem navMenuItem) { var popup = new Popup { @@ -46,18 +47,23 @@ internal class NavMenuItemTheme : BaseNavMenuItemTheme Name = PopupFramePart }; - TokenResourceBinder.CreateTokenBinding(popup, Popup.MarginToAnchorProperty, - NavMenuTokenKey.TopLevelItemPopupMarginToAnchor); - TokenResourceBinder.CreateTokenBinding(border, Border.CornerRadiusProperty, - NavMenuTokenKey.MenuPopupBorderRadius); - TokenResourceBinder.CreateTokenBinding(border, Layoutable.MinWidthProperty, - NavMenuTokenKey.MenuPopupMinWidth); - TokenResourceBinder.CreateTokenBinding(border, Layoutable.MaxWidthProperty, - NavMenuTokenKey.MenuPopupMaxWidth); - TokenResourceBinder.CreateTokenBinding(border, Layoutable.MaxHeightProperty, - NavMenuTokenKey.MenuPopupMaxHeight); - TokenResourceBinder.CreateTokenBinding(border, Decorator.PaddingProperty, - NavMenuTokenKey.MenuPopupContentPadding); + navMenuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(popup, + Popup.MarginToAnchorProperty, + NavMenuTokenKey.TopLevelItemPopupMarginToAnchor)); + navMenuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(border, + Border.CornerRadiusProperty, + NavMenuTokenKey.MenuPopupBorderRadius)); + navMenuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(border, + Layoutable.MinWidthProperty, + NavMenuTokenKey.MenuPopupMinWidth)); + navMenuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(border, + Layoutable.MaxWidthProperty, + NavMenuTokenKey.MenuPopupMaxWidth)); + navMenuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(border, + Layoutable.MaxHeightProperty, + NavMenuTokenKey.MenuPopupMaxHeight)); + navMenuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(border, Decorator.PaddingProperty, + NavMenuTokenKey.MenuPopupContentPadding)); var scrollViewer = new MenuScrollViewer(); var itemsPresenter = new ItemsPresenter @@ -71,10 +77,11 @@ internal class NavMenuItemTheme : BaseNavMenuItemTheme popup.Child = border; - TokenResourceBinder.CreateTokenBinding(popup, Popup.MarginToAnchorProperty, - NavMenuTokenKey.TopLevelItemPopupMarginToAnchor); - TokenResourceBinder.CreateTokenBinding(popup, Popup.MaskShadowsProperty, - NavMenuTokenKey.MenuPopupBoxShadows); + navMenuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(popup, + Popup.MarginToAnchorProperty, + NavMenuTokenKey.TopLevelItemPopupMarginToAnchor)); + navMenuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(popup, Popup.MaskShadowsProperty, + NavMenuTokenKey.MenuPopupBoxShadows)); CreateTemplateParentBinding(popup, Popup.IsOpenProperty, NavMenuItem.IsSubMenuOpenProperty, BindingMode.TwoWay); diff --git a/src/AtomUI.Controls/NavMenu/NavMenuTheme.cs b/src/AtomUI.Controls/NavMenu/NavMenuTheme.cs index 0a450a67f..2f3c2f019 100644 --- a/src/AtomUI.Controls/NavMenu/NavMenuTheme.cs +++ b/src/AtomUI.Controls/NavMenu/NavMenuTheme.cs @@ -26,7 +26,7 @@ internal class NavMenuTheme : BaseControlTheme protected override IControlTemplate BuildControlTemplate() { - return new FuncControlTemplate((menu, scope) => + return new FuncControlTemplate((navMenu, scope) => { var itemPresenter = new ItemsPresenter { @@ -47,8 +47,8 @@ internal class NavMenuTheme : BaseControlTheme CreateTemplateParentBinding(horizontalLine, Rectangle.IsVisibleProperty, NavMenu.ModeProperty, BindingMode.Default, new FuncValueConverter(v => v == NavMenuMode.Horizontal)); - TokenResourceBinder.CreateTokenBinding(horizontalLine, Rectangle.FillProperty, - SharedTokenKey.ColorBorderSecondary); + navMenu.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(horizontalLine, Rectangle.FillProperty, + SharedTokenKey.ColorBorderSecondary)); var border = new Border { diff --git a/src/AtomUI.Controls/NavMenu/TopLevelHorizontalNavMenuItemTheme.cs b/src/AtomUI.Controls/NavMenu/TopLevelHorizontalNavMenuItemTheme.cs index ba082ddf5..1452a1b3e 100644 --- a/src/AtomUI.Controls/NavMenu/TopLevelHorizontalNavMenuItemTheme.cs +++ b/src/AtomUI.Controls/NavMenu/TopLevelHorizontalNavMenuItemTheme.cs @@ -60,7 +60,7 @@ internal class TopLevelHorizontalNavMenuItemTheme : BaseControlTheme LastChildFill = true }; - var popup = CreateMenuPopup(); + var popup = CreateMenuPopup(menuItem); popup.RegisterInNameScope(scope); contentLayout.Children.Add(popup); @@ -77,8 +77,8 @@ internal class TopLevelHorizontalNavMenuItemTheme : BaseControlTheme CreateTemplateParentBinding(iconPresenter, ContentPresenter.IsVisibleProperty, NavMenuItem.IconProperty, BindingMode.Default, ObjectConverters.IsNotNull); - TokenResourceBinder.CreateTokenBinding(iconPresenter, Layoutable.MarginProperty, - NavMenuTokenKey.IconMargin); + menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(iconPresenter, Layoutable.MarginProperty, + NavMenuTokenKey.IconMargin)); contentLayout.Children.Add(iconPresenter); @@ -140,7 +140,7 @@ internal class TopLevelHorizontalNavMenuItemTheme : BaseControlTheme }); } - private Popup CreateMenuPopup() + private Popup CreateMenuPopup(NavMenuItem navMenuItem) { var popup = new Popup { @@ -154,20 +154,20 @@ internal class TopLevelHorizontalNavMenuItemTheme : BaseControlTheme CreateTemplateParentBinding(border, Border.MinWidthProperty, NavMenuItem.EffectivePopupMinWidthProperty); - TokenResourceBinder.CreateTokenBinding(border, Border.BackgroundProperty, - SharedTokenKey.ColorBgContainer); - TokenResourceBinder.CreateTokenBinding(border, Border.CornerRadiusProperty, - MenuTokenKey.MenuPopupBorderRadius); - TokenResourceBinder.CreateTokenBinding(border, Layoutable.MinWidthProperty, - MenuTokenKey.MenuPopupMinWidth); - TokenResourceBinder.CreateTokenBinding(border, Layoutable.MaxWidthProperty, - MenuTokenKey.MenuPopupMaxWidth); - TokenResourceBinder.CreateTokenBinding(border, Layoutable.MinHeightProperty, - MenuTokenKey.MenuPopupMinHeight); - TokenResourceBinder.CreateTokenBinding(border, Layoutable.MaxHeightProperty, - MenuTokenKey.MenuPopupMaxHeight); - TokenResourceBinder.CreateTokenBinding(border, Decorator.PaddingProperty, - MenuTokenKey.MenuPopupContentPadding); + navMenuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(border, Border.BackgroundProperty, + SharedTokenKey.ColorBgContainer)); + navMenuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(border, Border.CornerRadiusProperty, + MenuTokenKey.MenuPopupBorderRadius)); + navMenuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(border, Layoutable.MinWidthProperty, + MenuTokenKey.MenuPopupMinWidth)); + navMenuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(border, Layoutable.MaxWidthProperty, + MenuTokenKey.MenuPopupMaxWidth)); + navMenuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(border, Layoutable.MinHeightProperty, + MenuTokenKey.MenuPopupMinHeight)); + navMenuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(border, Layoutable.MaxHeightProperty, + MenuTokenKey.MenuPopupMaxHeight)); + navMenuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(border, Decorator.PaddingProperty, + MenuTokenKey.MenuPopupContentPadding)); var scrollViewer = new MenuScrollViewer(); var itemsPresenter = new ItemsPresenter @@ -181,10 +181,10 @@ internal class TopLevelHorizontalNavMenuItemTheme : BaseControlTheme border.Child = scrollViewer; popup.Child = border; - TokenResourceBinder.CreateTokenBinding(popup, Popup.MarginToAnchorProperty, - MenuTokenKey.TopLevelItemPopupMarginToAnchor); - TokenResourceBinder.CreateTokenBinding(popup, Popup.MaskShadowsProperty, - MenuTokenKey.MenuPopupBoxShadows); + navMenuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(popup, Popup.MarginToAnchorProperty, + MenuTokenKey.TopLevelItemPopupMarginToAnchor)); + navMenuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(popup, Popup.MaskShadowsProperty, + MenuTokenKey.MenuPopupBoxShadows)); CreateTemplateParentBinding(popup, Popup.IsOpenProperty, NavMenuItem.IsSubMenuOpenProperty, BindingMode.TwoWay);