diff --git a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TabControlDemoCtl.xaml b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TabControlDemoCtl.xaml
index 1bcd6060..94e05c27 100644
--- a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TabControlDemoCtl.xaml
+++ b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TabControlDemoCtl.xaml
@@ -36,7 +36,7 @@
-
+
diff --git a/src/Shared/HandyControl_Shared/Controls/TabControl/TabControl.cs b/src/Shared/HandyControl_Shared/Controls/TabControl/TabControl.cs
index aac5c5be..a4486bf4 100644
--- a/src/Shared/HandyControl_Shared/Controls/TabControl/TabControl.cs
+++ b/src/Shared/HandyControl_Shared/Controls/TabControl/TabControl.cs
@@ -3,6 +3,7 @@ using System.Collections.Specialized;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
+using System.Windows.Input;
using HandyControl.Data;
using HandyControl.Tools.Extension;
@@ -236,33 +237,15 @@ namespace HandyControl.Controls
}
}
- private void Menu_Closed(object sender, RoutedEventArgs e)
- {
- _buttonOverflow.IsChecked = false;
- }
+ private void Menu_Closed(object sender, RoutedEventArgs e) => _buttonOverflow.IsChecked = false;
- private void ButtonScrollRight_Click(object sender, RoutedEventArgs e)
- {
- var currentOffset = _scrollviewerOverflow.CurrentHorizontalOffset;
- var offset = currentOffset + (TabItemWidth - currentOffset % TabItemWidth);
+ private void ButtonScrollRight_Click(object sender, RoutedEventArgs e) =>
+ _scrollviewerOverflow.ScrollToHorizontalOffsetInternal(Math.Min(
+ _scrollviewerOverflow.CurrentHorizontalOffset + TabItemWidth, _scrollviewerOverflow.ScrollableWidth));
- if (offset <= _scrollviewerOverflow.ScrollableWidth)
- {
- _scrollviewerOverflow.ScrollToHorizontalOffsetInternal(offset);
- }
- }
-
- private void ButtonScrollLeft_Click(object sender, RoutedEventArgs e)
- {
- var currentOffset = _scrollviewerOverflow.CurrentHorizontalOffset;
- var modulo = currentOffset % TabItemWidth;
- var offset = currentOffset - (modulo < 1e-6 ? TabItemWidth : modulo);
-
- if (offset >= 0)
- {
- _scrollviewerOverflow.ScrollToHorizontalOffsetInternal(offset);
- }
- }
+ private void ButtonScrollLeft_Click(object sender, RoutedEventArgs e) =>
+ _scrollviewerOverflow.ScrollToHorizontalOffsetInternal(Math.Max(
+ _scrollviewerOverflow.CurrentHorizontalOffset - TabItemWidth, 0));
private void ButtonOverflow_Click(object sender, RoutedEventArgs e)
{
@@ -304,5 +287,12 @@ namespace HandyControl.Controls
}
}
}
+
+ internal double GetHorizontalOffset() => _scrollviewerOverflow?.CurrentHorizontalOffset ?? 0;
+
+ internal void UpdateScroll() => _scrollviewerOverflow?.RaiseEvent(new MouseWheelEventArgs(Mouse.PrimaryDevice, Environment.TickCount, 0)
+ {
+ RoutedEvent = MouseWheelEvent
+ });
}
}
\ No newline at end of file
diff --git a/src/Shared/HandyControl_Shared/Controls/TabControl/TabItem.cs b/src/Shared/HandyControl_Shared/Controls/TabControl/TabItem.cs
index a3079b53..02f22938 100644
--- a/src/Shared/HandyControl_Shared/Controls/TabControl/TabItem.cs
+++ b/src/Shared/HandyControl_Shared/Controls/TabControl/TabItem.cs
@@ -87,6 +87,11 @@ namespace HandyControl.Controls
///
private int _currentIndex;
+ ///
+ /// 标签容器横向滚动距离
+ ///
+ private double _scrollHorizontalOffset;
+
///
/// 标签容器
///
@@ -178,17 +183,21 @@ namespace HandyControl.Controls
base.OnMouseLeftButtonDown(e);
if (TabControlParent.IsDraggable && !ItemIsDragging && !_isDragging)
{
+ TabControlParent.UpdateScroll();
TabPanel.FluidMoveDuration = new Duration(TimeSpan.FromSeconds(0));
_mouseDownOffsetX = RenderTransform.Value.OffsetX;
- var mx = TranslatePoint(new Point(), TabControlParent).X;
+ _scrollHorizontalOffset = TabControlParent.GetHorizontalOffset();
+ var mx = TranslatePoint(new Point(), TabControlParent).X + _scrollHorizontalOffset;
_mouseDownIndex = CalLocationIndex(mx);
- _maxMoveLeft = -_mouseDownIndex * ItemWidth;
+ var subIndex = _mouseDownIndex - CalLocationIndex(_scrollHorizontalOffset);
+ _maxMoveLeft = -subIndex * ItemWidth;
_maxMoveRight = TabControlParent.ActualWidth - ActualWidth + _maxMoveLeft;
_isDragging = true;
ItemIsDragging = true;
_isWaiting = true;
_dragPoint = e.GetPosition(TabControlParent);
+ _dragPoint = new Point(_dragPoint.X + +_scrollHorizontalOffset, _dragPoint.Y);
_mouseDownPoint = _dragPoint;
CaptureMouse();
}
@@ -199,9 +208,10 @@ namespace HandyControl.Controls
base.OnMouseMove(e);
if (ItemIsDragging && _isDragging)
{
- var subX = TranslatePoint(new Point(), TabControlParent).X;
+ var subX = TranslatePoint(new Point(), TabControlParent).X + _scrollHorizontalOffset;
CurrentIndex = CalLocationIndex(subX);
var p = e.GetPosition(TabControlParent);
+ p = new Point(p.X + _scrollHorizontalOffset, p.Y);
var subLeft = p.X - _dragPoint.X;
var totalLeft = p.X - _mouseDownPoint.X;
@@ -229,7 +239,7 @@ namespace HandyControl.Controls
ReleaseMouseCapture();
if (_isDragged)
{
- var subX = TranslatePoint(new Point(), TabControlParent).X;
+ var subX = TranslatePoint(new Point(), TabControlParent).X + _scrollHorizontalOffset;
var index = CalLocationIndex(subX);
var left = index * ItemWidth;
var offsetX = RenderTransform.Value.OffsetX;
@@ -273,7 +283,7 @@ namespace HandyControl.Controls
animation.Completed += (s1, e1) => AnimationCompleted();
var f = new TranslateTransform(offsetX, 0);
RenderTransform = f;
- f.BeginAnimation(TranslateTransform.XProperty, animation);
+ f.BeginAnimation(TranslateTransform.XProperty, animation, HandoffBehavior.Compose);
}
///
diff --git a/src/Shared/HandyControl_Shared/Themes/Styles/TabControl.xaml b/src/Shared/HandyControl_Shared/Themes/Styles/TabControl.xaml
index 3214908e..7222865b 100644
--- a/src/Shared/HandyControl_Shared/Themes/Styles/TabControl.xaml
+++ b/src/Shared/HandyControl_Shared/Themes/Styles/TabControl.xaml
@@ -79,8 +79,8 @@
-
-
+
+
@@ -107,39 +107,34 @@
-
-
+
+
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
@@ -148,7 +143,7 @@
-
+
@@ -164,9 +159,13 @@
-
+
+
+
+
+
-
+