From 740ac6d4a362976653f3cc51f4c1efb4e095eeb5 Mon Sep 17 00:00:00 2001 From: NaBian <836904362@qq.com> Date: Thu, 5 Aug 2021 22:45:40 +0800 Subject: [PATCH] RibbonTabHeader support for Collapsed --- .../Controls/Ribbon/RibbonTab.cs | 12 +++++----- .../Controls/Ribbon/RibbonTabHeader.cs | 24 ++++++++++++++----- .../HandyControl_Shared/Data/ValueBoxes.cs | 23 +++++++++++++++++- .../Themes/Styles/Ribbon.xaml | 11 +++++---- 4 files changed, 53 insertions(+), 17 deletions(-) diff --git a/src/Shared/HandyControl_Shared/Controls/Ribbon/RibbonTab.cs b/src/Shared/HandyControl_Shared/Controls/Ribbon/RibbonTab.cs index 90a53309..e9db9547 100644 --- a/src/Shared/HandyControl_Shared/Controls/Ribbon/RibbonTab.cs +++ b/src/Shared/HandyControl_Shared/Controls/Ribbon/RibbonTab.cs @@ -2,7 +2,6 @@ using System.Windows.Controls; using System.Windows.Controls.Primitives; using HandyControl.Data; -using HandyControl.Tools; namespace HandyControl.Controls { @@ -75,11 +74,16 @@ namespace HandyControl.Controls Ribbon?.NotifyTabHeaderChanged(); } + protected override DependencyObject GetContainerForItemOverride() => new RibbonGroup(); + + protected override bool IsItemItsOwnContainerOverride(object item) => item is RibbonGroup; + private static void OnVisibilityChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var ribbonTab = (RibbonTab) d; - var ribbon = ribbonTab.Ribbon; + ribbonTab.RibbonTabHeader?.CoerceValue(VisibilityProperty); + var ribbon = ribbonTab.Ribbon; if (ribbon == null || !ribbonTab.IsSelected || (Visibility) e.OldValue != Visibility.Visible || @@ -90,9 +94,5 @@ namespace HandyControl.Controls ribbon.ResetSelection(); } - - protected override DependencyObject GetContainerForItemOverride() => new RibbonGroup(); - - protected override bool IsItemItsOwnContainerOverride(object item) => item is RibbonGroup; } } diff --git a/src/Shared/HandyControl_Shared/Controls/Ribbon/RibbonTabHeader.cs b/src/Shared/HandyControl_Shared/Controls/Ribbon/RibbonTabHeader.cs index 74c2028b..a45defbf 100644 --- a/src/Shared/HandyControl_Shared/Controls/Ribbon/RibbonTabHeader.cs +++ b/src/Shared/HandyControl_Shared/Controls/Ribbon/RibbonTabHeader.cs @@ -25,16 +25,15 @@ namespace HandyControl.Controls } } + static RibbonTabHeader() + { + VisibilityProperty.OverrideMetadata(typeof(RibbonTabHeader), new FrameworkPropertyMetadata(null, CoerceVisibility)); + } + public static readonly DependencyProperty IsSelectedProperty = DependencyProperty.Register( "IsSelected", typeof(bool), typeof(RibbonTabHeader), new PropertyMetadata(ValueBoxes.FalseBox, OnIsSelectedChanged, CoerceIsSelected)); - private static object CoerceIsSelected(DependencyObject d, object basevalue) - { - var ribbonTab = ((RibbonTabHeader) d).RibbonTab; - return ribbonTab != null ? ValueBoxes.BooleanBox(ribbonTab.IsSelected) : basevalue; - } - private static void OnIsSelectedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { ((RibbonTabHeader) d).OnIsSelectedChanged((bool) e.OldValue, (bool) e.NewValue); @@ -49,6 +48,7 @@ namespace HandyControl.Controls internal void PrepareRibbonTabHeader() { CoerceValue(IsSelectedProperty); + CoerceValue(VisibilityProperty); } protected virtual void OnIsSelectedChanged(bool oldIsSelected, bool newIsSelected) @@ -80,5 +80,17 @@ namespace HandyControl.Controls ribbonTab.IsSelected = true; } + + private static object CoerceIsSelected(DependencyObject d, object basevalue) + { + var ribbonTab = ((RibbonTabHeader) d).RibbonTab; + return ribbonTab != null ? ValueBoxes.BooleanBox(ribbonTab.IsSelected) : basevalue; + } + + private static object CoerceVisibility(DependencyObject d, object basevalue) + { + var ribbonTab = ((RibbonTabHeader) d).RibbonTab; + return ribbonTab != null ? ValueBoxes.VisibilityBox(ribbonTab.Visibility) : basevalue; + } } } diff --git a/src/Shared/HandyControl_Shared/Data/ValueBoxes.cs b/src/Shared/HandyControl_Shared/Data/ValueBoxes.cs index 8e216bec..800ae300 100644 --- a/src/Shared/HandyControl_Shared/Data/ValueBoxes.cs +++ b/src/Shared/HandyControl_Shared/Data/ValueBoxes.cs @@ -1,4 +1,6 @@ -using System.Windows.Controls; +using System; +using System.Windows; +using System.Windows.Controls; namespace HandyControl.Data; @@ -15,10 +17,18 @@ internal static class ValueBoxes internal static object HorizontalBox = Orientation.Horizontal; + internal static object VisibleBox = Visibility.Visible; + + internal static object CollapsedBox = Visibility.Collapsed; + + internal static object HiddenBox = Visibility.Hidden; + internal static object Double0Box = .0; internal static object Double01Box = .1; + internal static object Double0Box = .0; + internal static object Double1Box = 1.0; internal static object Double10Box = 10.0; @@ -47,4 +57,15 @@ internal static class ValueBoxes internal static object OrientationBox(Orientation value) => value == Orientation.Horizontal ? HorizontalBox : VerticalBox; + + internal static object VisibilityBox(Visibility value) + { + return value switch + { + Visibility.Visible => VisibleBox, + Visibility.Hidden => HiddenBox, + Visibility.Collapsed => CollapsedBox, + _ => throw new ArgumentOutOfRangeException(nameof(value), value, null) + }; + } } diff --git a/src/Shared/HandyControl_Shared/Themes/Styles/Ribbon.xaml b/src/Shared/HandyControl_Shared/Themes/Styles/Ribbon.xaml index 2f0b7cf9..48c6d4db 100644 --- a/src/Shared/HandyControl_Shared/Themes/Styles/Ribbon.xaml +++ b/src/Shared/HandyControl_Shared/Themes/Styles/Ribbon.xaml @@ -51,6 +51,7 @@ + @@ -59,10 +60,12 @@ - - - - + + + + + +