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.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();
}
}
}
}
@@ -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>
<Style TargetType="hc:RibbonGroup">
<Setter Property="Focusable" Value="False"/>
<Setter Property="Height" Value="95"/>
<Setter Property="BorderBrush" Value="{DynamicResource BorderBrush}"/>
<Setter Property="Padding" Value="6"/>
@@ -73,6 +74,7 @@
</Style>
<Style TargetType="hc:RibbonTab">
<Setter Property="Focusable" Value="False"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="ItemsPanel">
<Setter.Value>
@@ -94,6 +96,7 @@
</Style>
<Style TargetType="hc:Ribbon">
<Setter Property="Focusable" Value="False"/>
<Setter Property="Background" Value="{DynamicResource RegionBrush}"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="BorderBrush" Value="{DynamicResource BorderBrush}"/>
@@ -123,7 +126,7 @@
<DropShadowEffect BlurRadius="8" ShadowDepth="2" Direction="-90" Color="{StaticResource EffectShadowColor}" Opacity=".1" RenderingBias="Performance"/>
</Border.Effect>
</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>
<ItemsPanelTemplate>
<hc:SimpleStackPanel Orientation="Horizontal"/>