From 03a4777d293fec7bfc010c04094c06d725cd5de7 Mon Sep 17 00:00:00 2001
From: NaBian <836904362@qq.com>
Date: Wed, 4 Aug 2021 23:13:43 +0800
Subject: [PATCH] optimized tab switching logic
---
.../Controls/Ribbon/Ribbon.cs | 8 ++----
.../Controls/Ribbon/RibbonTab.cs | 9 ++++--
.../Controls/Ribbon/RibbonTabHeader.cs | 28 +++++++++++++++++--
.../Ribbon/RibbonTabHeaderItemsControl.cs | 10 +++++++
.../Themes/Styles/Ribbon.xaml | 5 +++-
5 files changed, 48 insertions(+), 12 deletions(-)
diff --git a/src/Shared/HandyControl_Shared/Controls/Ribbon/Ribbon.cs b/src/Shared/HandyControl_Shared/Controls/Ribbon/Ribbon.cs
index 0578655b..2ae4e8ac 100644
--- a/src/Shared/HandyControl_Shared/Controls/Ribbon/Ribbon.cs
+++ b/src/Shared/HandyControl_Shared/Controls/Ribbon/Ribbon.cs
@@ -4,6 +4,7 @@ using System.Collections.Specialized;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
+using System.Windows.Input;
namespace HandyControl.Controls
{
@@ -51,7 +52,7 @@ namespace HandyControl.Controls
InitializeSelection();
}
- internal void NotifyMouseClickedOnTabHeader(RibbonTabHeader tabHeader)
+ internal void NotifyMouseClickedOnTabHeader(RibbonTabHeader tabHeader, MouseButtonEventArgs e)
{
if (_tabHeaderItemsControl == null)
{
@@ -110,11 +111,6 @@ namespace HandyControl.Controls
return;
}
- if (e.RemovedItems.Count > 0 && ItemContainerGenerator.ContainerFromItem(e.RemovedItems[0]) is RibbonTab oldRibbonTab)
- {
- oldRibbonTab.IsSelected = false;
- }
-
SelectedItem = e.AddedItems[0];
}
diff --git a/src/Shared/HandyControl_Shared/Controls/Ribbon/RibbonTab.cs b/src/Shared/HandyControl_Shared/Controls/Ribbon/RibbonTab.cs
index 1f5e3da6..90a53309 100644
--- a/src/Shared/HandyControl_Shared/Controls/Ribbon/RibbonTab.cs
+++ b/src/Shared/HandyControl_Shared/Controls/Ribbon/RibbonTab.cs
@@ -36,8 +36,13 @@ namespace HandyControl.Controls
VisibilityProperty.OverrideMetadata(typeof(RibbonTab), new PropertyMetadata(Visibility.Visible, OnVisibilityChanged));
}
- public static readonly DependencyProperty IsSelectedProperty = DependencyProperty.Register(
- "IsSelected", typeof(bool), typeof(RibbonTab), new PropertyMetadata(ValueBoxes.FalseBox, OnIsSelectedChanged));
+ public static readonly DependencyProperty IsSelectedProperty =
+ Selector.IsSelectedProperty.AddOwner(typeof(RibbonTab),
+ new FrameworkPropertyMetadata(ValueBoxes.FalseBox,
+ FrameworkPropertyMetadataOptions.AffectsParentMeasure |
+ FrameworkPropertyMetadataOptions.BindsTwoWayByDefault |
+ FrameworkPropertyMetadataOptions.Journal,
+ OnIsSelectedChanged));
private static void OnIsSelectedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
diff --git a/src/Shared/HandyControl_Shared/Controls/Ribbon/RibbonTabHeader.cs b/src/Shared/HandyControl_Shared/Controls/Ribbon/RibbonTabHeader.cs
index 569668d0..74c2028b 100644
--- a/src/Shared/HandyControl_Shared/Controls/Ribbon/RibbonTabHeader.cs
+++ b/src/Shared/HandyControl_Shared/Controls/Ribbon/RibbonTabHeader.cs
@@ -46,6 +46,11 @@ namespace HandyControl.Controls
set => SetValue(IsSelectedProperty, value);
}
+ internal void PrepareRibbonTabHeader()
+ {
+ CoerceValue(IsSelectedProperty);
+ }
+
protected virtual void OnIsSelectedChanged(bool oldIsSelected, bool newIsSelected)
{
@@ -53,10 +58,27 @@ namespace HandyControl.Controls
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
{
- base.OnMouseLeftButtonDown(e);
+ var ribbon = Ribbon;
+ if (ribbon != null)
+ {
+ ribbon.NotifyMouseClickedOnTabHeader(this, e);
+ e.Handled = true;
+ }
- Ribbon.NotifyMouseClickedOnTabHeader(this);
- RibbonTab.IsSelected = true;
+ base.OnMouseLeftButtonDown(e);
+ }
+
+ protected override void OnGotKeyboardFocus(KeyboardFocusChangedEventArgs e)
+ {
+ base.OnGotKeyboardFocus(e);
+
+ var ribbonTab = RibbonTab;
+ if (ribbonTab == null)
+ {
+ return;
+ }
+
+ ribbonTab.IsSelected = true;
}
}
}
diff --git a/src/Shared/HandyControl_Shared/Controls/Ribbon/RibbonTabHeaderItemsControl.cs b/src/Shared/HandyControl_Shared/Controls/Ribbon/RibbonTabHeaderItemsControl.cs
index 588e2e35..5e0720fe 100644
--- a/src/Shared/HandyControl_Shared/Controls/Ribbon/RibbonTabHeaderItemsControl.cs
+++ b/src/Shared/HandyControl_Shared/Controls/Ribbon/RibbonTabHeaderItemsControl.cs
@@ -8,5 +8,15 @@ namespace HandyControl.Controls
protected override DependencyObject GetContainerForItemOverride() => new RibbonTabHeader();
protected override bool IsItemItsOwnContainerOverride(object item) => item is RibbonTabHeader;
+
+ protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
+ {
+ base.PrepareContainerForItemOverride(element, item);
+
+ if (element is RibbonTabHeader ribbonTabHeader)
+ {
+ ribbonTabHeader.PrepareRibbonTabHeader();
+ }
+ }
}
}
diff --git a/src/Shared/HandyControl_Shared/Themes/Styles/Ribbon.xaml b/src/Shared/HandyControl_Shared/Themes/Styles/Ribbon.xaml
index f5b2d876..2f0b7cf9 100644
--- a/src/Shared/HandyControl_Shared/Themes/Styles/Ribbon.xaml
+++ b/src/Shared/HandyControl_Shared/Themes/Styles/Ribbon.xaml
@@ -6,6 +6,7 @@
M0,0 8,0 8,1 1,1 1,8 0,8 M 3.7,3 8,7.3 8,4 9,4 9,9 4,9 4,8 7.3,8 3,3.7