optimized tab switching logic
This commit is contained in:
1 parent
41c661da1a
commit
03a4777d29
5 files changed
+48
-12
No files matched your search
@@ -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];
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user