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