optimized tab switching logic

This commit is contained in:
NaBian committed 2022-06-13 23:06:48 +08:00
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;
using System.Windows.Controls; using System.Windows.Controls;
using System.Windows.Controls.Primitives; using System.Windows.Controls.Primitives;
using System.Windows.Input;
namespace HandyControl.Controls namespace HandyControl.Controls
{ {
@@ -51,7 +52,7 @@ namespace HandyControl.Controls
InitializeSelection(); InitializeSelection();
} }
internal void NotifyMouseClickedOnTabHeader(RibbonTabHeader tabHeader) internal void NotifyMouseClickedOnTabHeader(RibbonTabHeader tabHeader, MouseButtonEventArgs e)
{ {
if (_tabHeaderItemsControl == null) if (_tabHeaderItemsControl == null)
{ {
@@ -110,11 +111,6 @@ namespace HandyControl.Controls
return; return;
} }
if (e.RemovedItems.Count > 0 && ItemContainerGenerator.ContainerFromItem(e.RemovedItems[0]) is RibbonTab oldRibbonTab)
{
oldRibbonTab.IsSelected = false;
}
SelectedItem = e.AddedItems[0]; SelectedItem = e.AddedItems[0];
} }
@@ -36,8 +36,13 @@ namespace HandyControl.Controls
VisibilityProperty.OverrideMetadata(typeof(RibbonTab), new PropertyMetadata(Visibility.Visible, OnVisibilityChanged)); VisibilityProperty.OverrideMetadata(typeof(RibbonTab), new PropertyMetadata(Visibility.Visible, OnVisibilityChanged));
} }
public static readonly DependencyProperty IsSelectedProperty = DependencyProperty.Register( public static readonly DependencyProperty IsSelectedProperty =
"IsSelected", typeof(bool), typeof(RibbonTab), new PropertyMetadata(ValueBoxes.FalseBox, OnIsSelectedChanged)); Selector.IsSelectedProperty.AddOwner(typeof(RibbonTab),
new FrameworkPropertyMetadata(ValueBoxes.FalseBox,
FrameworkPropertyMetadataOptions.AffectsParentMeasure |
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault |
FrameworkPropertyMetadataOptions.Journal,
OnIsSelectedChanged));
private static void OnIsSelectedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) private static void OnIsSelectedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{ {
@@ -46,6 +46,11 @@ namespace HandyControl.Controls
set => SetValue(IsSelectedProperty, value); set => SetValue(IsSelectedProperty, value);
} }
internal void PrepareRibbonTabHeader()
{
CoerceValue(IsSelectedProperty);
}
protected virtual void OnIsSelectedChanged(bool oldIsSelected, bool newIsSelected) protected virtual void OnIsSelectedChanged(bool oldIsSelected, bool newIsSelected)
{ {
@@ -53,10 +58,27 @@ namespace HandyControl.Controls
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) 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); base.OnMouseLeftButtonDown(e);
RibbonTab.IsSelected = true; }
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 DependencyObject GetContainerForItemOverride() => new RibbonTabHeader();
protected override bool IsItemItsOwnContainerOverride(object item) => item is 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();
}
}
} }
} }
@@ -6,6 +6,7 @@
<Geometry x:Key="DialogBoxLauncherGeometry">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</Geometry> <Geometry x:Key="DialogBoxLauncherGeometry">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</Geometry>
<Style TargetType="hc:RibbonGroup"> <Style TargetType="hc:RibbonGroup">
<Setter Property="Focusable" Value="False"/>
<Setter Property="Height" Value="95"/> <Setter Property="Height" Value="95"/>
<Setter Property="BorderBrush" Value="{DynamicResource BorderBrush}"/> <Setter Property="BorderBrush" Value="{DynamicResource BorderBrush}"/>
<Setter Property="Padding" Value="6"/> <Setter Property="Padding" Value="6"/>
@@ -73,6 +74,7 @@
</Style> </Style>
<Style TargetType="hc:RibbonTab"> <Style TargetType="hc:RibbonTab">
<Setter Property="Focusable" Value="False"/>
<Setter Property="VerticalContentAlignment" Value="Center"/> <Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="ItemsPanel"> <Setter Property="ItemsPanel">
<Setter.Value> <Setter.Value>
@@ -94,6 +96,7 @@
</Style> </Style>
<Style TargetType="hc:Ribbon"> <Style TargetType="hc:Ribbon">
<Setter Property="Focusable" Value="False"/>
<Setter Property="Background" Value="{DynamicResource RegionBrush}"/> <Setter Property="Background" Value="{DynamicResource RegionBrush}"/>
<Setter Property="BorderThickness" Value="0"/> <Setter Property="BorderThickness" Value="0"/>
<Setter Property="BorderBrush" Value="{DynamicResource BorderBrush}"/> <Setter Property="BorderBrush" Value="{DynamicResource BorderBrush}"/>
@@ -123,7 +126,7 @@
<DropShadowEffect BlurRadius="8" ShadowDepth="2" Direction="-90" Color="{StaticResource EffectShadowColor}" Opacity=".1" RenderingBias="Performance"/> <DropShadowEffect BlurRadius="8" ShadowDepth="2" Direction="-90" Color="{StaticResource EffectShadowColor}" Opacity=".1" RenderingBias="Performance"/>
</Border.Effect> </Border.Effect>
</Border> </Border>
<hc:RibbonTabHeaderItemsControl Grid.Row="0" Grid.Column="0" x:Name="PART_TabHeaderItemsControl" Margin="10,0,10,2"> <hc:RibbonTabHeaderItemsControl Focusable="False" Grid.Row="0" Grid.Column="0" x:Name="PART_TabHeaderItemsControl" Margin="10,0,10,2">
<ItemsControl.ItemsPanel> <ItemsControl.ItemsPanel>
<ItemsPanelTemplate> <ItemsPanelTemplate>
<hc:SimpleStackPanel Orientation="Horizontal"/> <hc:SimpleStackPanel Orientation="Horizontal"/>