From 4d49fe520c34722570f4d0298491ae82b49da00a Mon Sep 17 00:00:00 2001 From: chinboy Date: Tue, 4 Mar 2025 08:46:44 +0800 Subject: [PATCH] Refactor TabControl --- .../Segmented/SegmentedTheme.cs | 10 +++--- .../TabControl/BaseOverflowMenuItemTheme.cs | 36 +++++++++---------- .../TabControl/BaseTabItemTheme.cs | 7 ++-- .../TabControl/BaseTabScrollViewerTheme.cs | 12 +++---- .../TabControl/CardTabControlTheme.cs | 32 ++++++++--------- .../TabControl/TabControlTheme.cs | 10 +++--- .../TabStrip/BaseTabStripItemTheme.cs | 6 ++-- .../TabControl/TabStrip/CardTabStripTheme.cs | 31 +++++++--------- .../TabControl/TabStrip/TabStripTheme.cs | 8 +++-- 9 files changed, 76 insertions(+), 76 deletions(-) diff --git a/src/AtomUI.Controls/Segmented/SegmentedTheme.cs b/src/AtomUI.Controls/Segmented/SegmentedTheme.cs index 8b86c5cbb..56f62da02 100644 --- a/src/AtomUI.Controls/Segmented/SegmentedTheme.cs +++ b/src/AtomUI.Controls/Segmented/SegmentedTheme.cs @@ -24,7 +24,7 @@ internal class SegmentedTheme : BaseControlTheme { return new FuncControlTemplate((segmented, scope) => { - var Frame = new Border + var frame = new Border { Name = FramePart, ClipToBounds = true @@ -41,12 +41,12 @@ internal class SegmentedTheme : BaseControlTheme }) }; itemsPresenter.RegisterInNameScope(scope); - Frame.Child = itemsPresenter; + frame.Child = itemsPresenter; - CreateTemplateParentBinding(Frame, Border.CornerRadiusProperty, + CreateTemplateParentBinding(frame, Border.CornerRadiusProperty, TemplatedControl.CornerRadiusProperty); - CreateTemplateParentBinding(Frame, Decorator.PaddingProperty, TemplatedControl.PaddingProperty); - return Frame; + CreateTemplateParentBinding(frame, Decorator.PaddingProperty, TemplatedControl.PaddingProperty); + return frame; }); } diff --git a/src/AtomUI.Controls/TabControl/BaseOverflowMenuItemTheme.cs b/src/AtomUI.Controls/TabControl/BaseOverflowMenuItemTheme.cs index aa5bb16af..b6f9d6b17 100644 --- a/src/AtomUI.Controls/TabControl/BaseOverflowMenuItemTheme.cs +++ b/src/AtomUI.Controls/TabControl/BaseOverflowMenuItemTheme.cs @@ -1,8 +1,6 @@ -using AtomUI.IconPkg; -using AtomUI.IconPkg.AntDesign; +using AtomUI.IconPkg.AntDesign; using AtomUI.Media; using AtomUI.Theme; -using AtomUI.Theme.Data; using AtomUI.Theme.Styling; using AtomUI.Utils; using Avalonia; @@ -63,8 +61,6 @@ internal class BaseOverflowMenuItemTheme : BaseControlTheme }; Grid.SetColumn(itemTextPresenter, 0); - menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(itemTextPresenter, Layoutable.MarginProperty, - MenuTokenKey.ItemMargin)); CreateTemplateParentBinding(itemTextPresenter, ContentPresenter.ContentProperty, HeaderedSelectingItemsControl.HeaderProperty, BindingMode.Default, @@ -100,15 +96,6 @@ internal class BaseOverflowMenuItemTheme : BaseControlTheme }; CreateTemplateParentBinding(closeButton, Visual.IsVisibleProperty, BaseOverflowMenuItem.IsClosableProperty); - menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(menuCloseIcon, Icon.NormalFilledBrushProperty, - SharedTokenKey.ColorIcon)); - menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(menuCloseIcon, Icon.ActiveFilledBrushProperty, - SharedTokenKey.ColorIconHover)); - - menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(menuCloseIcon, Layoutable.WidthProperty, - SharedTokenKey.IconSizeSM)); - menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(menuCloseIcon, Layoutable.HeightProperty, - SharedTokenKey.IconSizeSM)); Grid.SetColumn(menuCloseIcon, 4); closeButton.RegisterInNameScope(scope); @@ -123,14 +110,13 @@ internal class BaseOverflowMenuItemTheme : BaseControlTheme protected override void BuildStyles() { - var commonStyle = new Style(selector => selector.Nesting()); - BuildCommonStyle(commonStyle); + BuildCommonStyle(); BuildDisabledStyle(); - Add(commonStyle); } - private void BuildCommonStyle(Style commonStyle) + private void BuildCommonStyle() { + var commonStyle = new Style(selector => selector.Nesting()); commonStyle.Add(TemplatedControl.ForegroundProperty, MenuTokenKey.ItemColor); { var borderStyle = new Style(selector => selector.Nesting().Template().Name(ItemDecoratorPart)); @@ -161,7 +147,21 @@ internal class BaseOverflowMenuItemTheme : BaseControlTheme borderStyle.Add(Border.BackgroundProperty, MenuTokenKey.ItemHoverBg); hoverStyle.Add(borderStyle); } + commonStyle.Add(hoverStyle); + + var itemTextPresenterStyle = new Style(selector => selector.Nesting().Template().Name(ItemTextPresenterPart)); + itemTextPresenterStyle.Add(Layoutable.MarginProperty, MenuTokenKey.ItemMargin); + commonStyle.Add(itemTextPresenterStyle); + + var closeButtonStyle = new Style(selector => selector.Nesting().Template().Name(ItemCloseButtonPart)); + closeButtonStyle.Add(IconButton.NormalIconColorProperty, SharedTokenKey.ColorIcon); + closeButtonStyle.Add(IconButton.ActiveIconColorProperty, SharedTokenKey.ColorIconHover); + closeButtonStyle.Add(IconButton.IconHeightProperty, SharedTokenKey.IconSizeSM); + closeButtonStyle.Add(IconButton.IconWidthProperty, SharedTokenKey.IconSizeSM); + commonStyle.Add(closeButtonStyle); + + Add(commonStyle); } private void BuildDisabledStyle() diff --git a/src/AtomUI.Controls/TabControl/BaseTabItemTheme.cs b/src/AtomUI.Controls/TabControl/BaseTabItemTheme.cs index 2d6c79326..df52200b2 100644 --- a/src/AtomUI.Controls/TabControl/BaseTabItemTheme.cs +++ b/src/AtomUI.Controls/TabControl/BaseTabItemTheme.cs @@ -81,8 +81,6 @@ internal class BaseTabItemTheme : BaseControlTheme Name = ItemCloseButtonPart }; iconButton.RegisterInNameScope(scope); - tabItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(iconButton, Layoutable.MarginProperty, - TabControlTokenKey.CloseIconMargin)); CreateTemplateParentBinding(iconButton, IconButton.IconProperty, TabItem.CloseIconProperty); CreateTemplateParentBinding(iconButton, Visual.IsVisibleProperty, TabItem.IsClosableProperty); @@ -97,12 +95,17 @@ internal class BaseTabItemTheme : BaseControlTheme commonStyle.Add(InputElement.CursorProperty, new SetterValueFactory(() => new Cursor(StandardCursorType.Hand))); commonStyle.Add(TemplatedControl.ForegroundProperty, TabControlTokenKey.ItemColor); + + var itemCloseButtonStyle = new Style(selector => selector.Nesting().Template().Name(ItemCloseButtonPart)); + itemCloseButtonStyle.Add(Layoutable.MarginProperty, TabControlTokenKey.CloseIconMargin); + commonStyle.Add(itemCloseButtonStyle); // Icon 一些通用属性 { var iconStyle = new Style(selector => selector.Nesting().Template().Name(ItemIconPart)); iconStyle.Add(Layoutable.MarginProperty, TabControlTokenKey.ItemIconMargin); commonStyle.Add(iconStyle); + } // hover diff --git a/src/AtomUI.Controls/TabControl/BaseTabScrollViewerTheme.cs b/src/AtomUI.Controls/TabControl/BaseTabScrollViewerTheme.cs index 2f65bc553..4789f6f88 100644 --- a/src/AtomUI.Controls/TabControl/BaseTabScrollViewerTheme.cs +++ b/src/AtomUI.Controls/TabControl/BaseTabScrollViewerTheme.cs @@ -48,18 +48,12 @@ internal class BaseTabScrollViewerTheme : BaseControlTheme menuIndicatorIcon.HorizontalAlignment = HorizontalAlignment.Center; menuIndicatorIcon.VerticalAlignment = VerticalAlignment.Center; - scrollViewer.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(menuIndicatorIcon, Icon.NormalFilledBrushProperty, - SharedTokenKey.ColorTextSecondary)); - var menuIndicator = new IconButton { Name = ScrollMenuIndicatorPart, Icon = menuIndicatorIcon }; - scrollViewer.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(menuIndicator, IconButton.IconWidthProperty, - SharedTokenKey.IconSize)); - scrollViewer.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(menuIndicator, IconButton.IconHeightProperty, - SharedTokenKey.IconSize)); + menuIndicator.RegisterInNameScope(scope); var scrollViewContent = CreateScrollContentPresenter(); @@ -110,6 +104,7 @@ internal class BaseTabScrollViewerTheme : BaseControlTheme CreateTemplateParentBinding(scrollViewContent, ScrollContentPresenter.VerticalSnapPointsTypeProperty, ScrollViewer.VerticalSnapPointsTypeProperty); var scrollGestureRecognizer = new ScrollGestureRecognizer(); + BindUtils.RelayBind(scrollViewContent, ScrollContentPresenter.CanHorizontallyScrollProperty, scrollGestureRecognizer, ScrollGestureRecognizer.CanHorizontallyScrollProperty); @@ -136,6 +131,9 @@ internal class BaseTabScrollViewerTheme : BaseControlTheme new Style(selector => selector.Nesting().Template().Name(ScrollMenuIndicatorPart)); menuIndicatorStyle.Add(DockPanel.DockProperty, Dock.Right); menuIndicatorStyle.Add(TemplatedControl.PaddingProperty, TabControlTokenKey.MenuIndicatorPaddingHorizontal); + menuIndicatorStyle.Add(IconButton.NormalIconColorProperty, SharedTokenKey.ColorTextSecondary); + menuIndicatorStyle.Add(IconButton.IconWidthProperty, SharedTokenKey.IconSize); + menuIndicatorStyle.Add(IconButton.IconHeightProperty, SharedTokenKey.IconSize); var startEdgeIndicatorStyle = new Style(selector => selector.Nesting().Template().Name(ScrollStartEdgeIndicatorPart)); diff --git a/src/AtomUI.Controls/TabControl/CardTabControlTheme.cs b/src/AtomUI.Controls/TabControl/CardTabControlTheme.cs index 79156ea4f..a3b745876 100644 --- a/src/AtomUI.Controls/TabControl/CardTabControlTheme.cs +++ b/src/AtomUI.Controls/TabControl/CardTabControlTheme.cs @@ -53,36 +53,21 @@ internal class CardTabControlTheme : BaseTabControlTheme var contentPanel = CreateTabStripContentPanel(scope); tabScrollViewer.Content = contentPanel; tabScrollViewer.TabControl = baseTabControl; - - var addTabIcon = AntDesignIconPackage.PlusOutlined(); - - baseTabControl.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(addTabIcon, Icon.NormalFilledBrushProperty, - TabControlTokenKey.ItemColor)); - baseTabControl.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(addTabIcon, Icon.ActiveFilledBrushProperty, - TabControlTokenKey.ItemHoverColor)); - baseTabControl.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(addTabIcon, Icon.DisabledFilledBrushProperty, - SharedTokenKey.ColorTextDisabled)); var addTabButton = new IconButton { Name = AddTabButtonPart, BorderThickness = new Thickness(1), - Icon = addTabIcon + Icon = AntDesignIconPackage.PlusOutlined() }; DockPanel.SetDock(addTabButton, Dock.Right); - baseTabControl.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(addTabButton, IconButton.IconHeightProperty, - SharedTokenKey.IconSize)); - baseTabControl.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(addTabButton, IconButton.IconWidthProperty, - SharedTokenKey.IconSize)); + CreateTemplateParentBinding(addTabButton, TemplatedControl.BorderThicknessProperty, CardTabControl.CardBorderThicknessProperty); CreateTemplateParentBinding(addTabButton, TemplatedControl.CornerRadiusProperty, CardTabControl.CardBorderRadiusProperty); CreateTemplateParentBinding(addTabButton, Visual.IsVisibleProperty, CardTabControl.IsShowAddTabButtonProperty); - - baseTabControl.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(addTabButton, TemplatedControl.BorderBrushProperty, - SharedTokenKey.ColorBorderSecondary)); - + addTabButton.RegisterInNameScope(scope); cardTabControlContainer.TabScrollViewer = tabScrollViewer; @@ -109,6 +94,17 @@ internal class CardTabControlTheme : BaseTabControlTheme { base.BuildStyles(); var commonStyle = new Style(selector => selector.Nesting()); + { + var addTabButtonStyle = new Style(selector => selector.Nesting().Template().Name(AddTabButtonPart)); + addTabButtonStyle.Add(IconButton.NormalIconColorProperty, TabControlTokenKey.ItemColor); + addTabButtonStyle.Add(IconButton.ActiveIconColorProperty, TabControlTokenKey.ItemHoverColor); + addTabButtonStyle.Add(IconButton.DisabledIconColorProperty, SharedTokenKey.ColorTextDisabled); + addTabButtonStyle.Add(TemplatedControl.BorderBrushProperty, SharedTokenKey.ColorBorderSecondary); + addTabButtonStyle.Add(IconButton.IconHeightProperty, SharedTokenKey.IconSize); + addTabButtonStyle.Add(IconButton.IconWidthProperty, SharedTokenKey.IconSize); + + commonStyle.Add(addTabButtonStyle); + } // 设置 items presenter 面板样式 // 分为上、右、下、左 diff --git a/src/AtomUI.Controls/TabControl/TabControlTheme.cs b/src/AtomUI.Controls/TabControl/TabControlTheme.cs index 62fbe9530..1e8edf471 100644 --- a/src/AtomUI.Controls/TabControl/TabControlTheme.cs +++ b/src/AtomUI.Controls/TabControl/TabControlTheme.cs @@ -59,9 +59,6 @@ internal class TabControlTheme : BaseTabControlTheme Name = SelectedItemIndicatorPart }; border.RegisterInNameScope(scope); - baseTabControl.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(border, - Border.BackgroundProperty, - TabControlTokenKey.InkBarColor)); layout.Children.Add(itemsPresenter); layout.Children.Add(border); @@ -74,6 +71,11 @@ internal class TabControlTheme : BaseTabControlTheme base.BuildStyles(); var commonStyle = new Style(selector => selector.Nesting()); + { + var indicatorStyle = new Style(selector => selector.Nesting().Template().Name(SelectedItemIndicatorPart)); + indicatorStyle.Add(Border.BackgroundProperty, TabControlTokenKey.InkBarColor); + commonStyle.Add(indicatorStyle); + } // 设置 items presenter 面板样式 // 分为上、右、下、左 { @@ -90,8 +92,8 @@ internal class TabControlTheme : BaseTabControlTheme var indicatorStyle = new Style(selector => selector.Nesting().Template().Name(SelectedItemIndicatorPart)); indicatorStyle.Add(Layoutable.HorizontalAlignmentProperty, HorizontalAlignment.Left); indicatorStyle.Add(Layoutable.VerticalAlignmentProperty, VerticalAlignment.Bottom); + topStyle.Add(indicatorStyle); - topStyle.Add(itemPresenterPanelStyle); commonStyle.Add(topStyle); } diff --git a/src/AtomUI.Controls/TabControl/TabStrip/BaseTabStripItemTheme.cs b/src/AtomUI.Controls/TabControl/TabStrip/BaseTabStripItemTheme.cs index 20ab9ae7f..f0cf5a14b 100644 --- a/src/AtomUI.Controls/TabControl/TabStrip/BaseTabStripItemTheme.cs +++ b/src/AtomUI.Controls/TabControl/TabStrip/BaseTabStripItemTheme.cs @@ -80,8 +80,6 @@ internal class BaseTabStripItemTheme : BaseControlTheme Name = ItemCloseButtonPart }; iconButton.RegisterInNameScope(scope); - stripItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(iconButton, - Layoutable.MarginProperty, TabControlTokenKey.CloseIconMargin)); CreateTemplateParentBinding(iconButton, IconButton.IconProperty, TabStripItem.CloseIconProperty); CreateTemplateParentBinding(iconButton, Visual.IsVisibleProperty, TabStripItem.IsClosableProperty); @@ -97,6 +95,10 @@ internal class BaseTabStripItemTheme : BaseControlTheme new SetterValueFactory(() => new Cursor(StandardCursorType.Hand))); commonStyle.Add(TemplatedControl.ForegroundProperty, TabControlTokenKey.ItemColor); + var itemCloseButtonStyle = new Style(selector => selector.Nesting().Template().Name(ItemCloseButtonPart)); + itemCloseButtonStyle.Add(Layoutable.MarginProperty, TabControlTokenKey.CloseIconMargin); + commonStyle.Add(itemCloseButtonStyle); + // Icon 一些通用属性 { var iconStyle = new Style(selector => selector.Nesting().Template().Name(ItemIconPart)); diff --git a/src/AtomUI.Controls/TabControl/TabStrip/CardTabStripTheme.cs b/src/AtomUI.Controls/TabControl/TabStrip/CardTabStripTheme.cs index db12b3b3f..039f85157 100644 --- a/src/AtomUI.Controls/TabControl/TabStrip/CardTabStripTheme.cs +++ b/src/AtomUI.Controls/TabControl/TabStrip/CardTabStripTheme.cs @@ -49,25 +49,11 @@ internal class CardTabStripTheme : BaseTabStripTheme tabScrollViewer.Content = contentPanel; tabScrollViewer.TabStrip = baseTabStrip; - var addTabIcon = AntDesignIconPackage.PlusOutlined(); - - baseTabStrip.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(addTabIcon, Icon.NormalFilledBrushProperty, - TabControlTokenKey.ItemColor)); - baseTabStrip.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(addTabIcon, Icon.ActiveFilledBrushProperty, - TabControlTokenKey.ItemHoverColor)); - baseTabStrip.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(addTabIcon, Icon.DisabledFilledBrushProperty, - SharedTokenKey.ColorTextDisabled)); - - baseTabStrip.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(addTabIcon, Layoutable.WidthProperty, - SharedTokenKey.IconSize)); - baseTabStrip.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(addTabIcon, Layoutable.HeightProperty, - SharedTokenKey.IconSize)); - var addTabButton = new IconButton { Name = AddTabButtonPart, BorderThickness = new Thickness(1), - Icon = addTabIcon + Icon = AntDesignIconPackage.PlusOutlined() }; CreateTemplateParentBinding(addTabButton, TemplatedControl.BorderThicknessProperty, @@ -76,9 +62,6 @@ internal class CardTabStripTheme : BaseTabStripTheme CardTabStrip.CardBorderRadiusProperty); CreateTemplateParentBinding(addTabButton, Visual.IsVisibleProperty, CardTabStrip.IsShowAddTabButtonProperty); - baseTabStrip.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(addTabButton, TemplatedControl.BorderBrushProperty, - SharedTokenKey.ColorBorderSecondary)); - addTabButton.RegisterInNameScope(scope); cardTabStripContainer.TabScrollViewer = tabScrollViewer; @@ -106,6 +89,18 @@ internal class CardTabStripTheme : BaseTabStripTheme base.BuildStyles(); var commonStyle = new Style(selector => selector.Nesting()); + { + var addTabButtonStyle = new Style(selector => selector.Nesting().Template().Name(AddTabButtonPart)); + addTabButtonStyle.Add(IconButton.NormalIconColorProperty, TabControlTokenKey.ItemColor); + addTabButtonStyle.Add(IconButton.ActiveIconColorProperty, TabControlTokenKey.ItemHoverColor); + addTabButtonStyle.Add(IconButton.DisabledIconColorProperty, SharedTokenKey.ColorTextDisabled); + addTabButtonStyle.Add(IconButton.IconWidthProperty, SharedTokenKey.IconSize); + addTabButtonStyle.Add(IconButton.IconHeightProperty, SharedTokenKey.IconSize); + addTabButtonStyle.Add(TemplatedControl.BorderBrushProperty, SharedTokenKey.ColorBorderSecondary); + + commonStyle.Add(addTabButtonStyle); + } + // 设置 items presenter 面板样式 // 分为上、右、下、左 { diff --git a/src/AtomUI.Controls/TabControl/TabStrip/TabStripTheme.cs b/src/AtomUI.Controls/TabControl/TabStrip/TabStripTheme.cs index 12010d4f5..6e18ea3c8 100644 --- a/src/AtomUI.Controls/TabControl/TabStrip/TabStripTheme.cs +++ b/src/AtomUI.Controls/TabControl/TabStrip/TabStripTheme.cs @@ -54,8 +54,6 @@ internal class TabStripTheme : BaseTabStripTheme Name = SelectedItemIndicatorPart }; border.RegisterInNameScope(scope); - baseTabStrip.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(border, Border.BackgroundProperty, - TabControlTokenKey.InkBarColor)); layout.Children.Add(itemsPresenter); layout.Children.Add(border); @@ -68,6 +66,12 @@ internal class TabStripTheme : BaseTabStripTheme base.BuildStyles(); var commonStyle = new Style(selector => selector.Nesting()); + { + var indicatorStyle = new Style(selector => selector.Nesting().Template().Name(SelectedItemIndicatorPart)); + indicatorStyle.Add(Border.BackgroundProperty, TabControlTokenKey.InkBarColor); + commonStyle.Add(indicatorStyle); + } + // 设置 items presenter 面板样式 // 分为上、右、下、左 {