@@ -29,8 +29,8 @@ public sealed partial class TabBar : BaseTabBar
29
29
30
30
public UIElement FooterElement
31
31
{
32
- get => ( UIElement ) GetValue ( FooterElementProperty ) ;
33
- set => SetValue ( FooterElementProperty , value ) ;
32
+ get => ( UIElement ) GetValue ( FooterElementProperty ) ;
33
+ set => SetValue ( FooterElementProperty , value ) ;
34
34
}
35
35
36
36
public static readonly DependencyProperty TabStripVisibilityProperty =
@@ -56,6 +56,12 @@ public bool AllowTabsDrag
56
56
public Rectangle DragArea
57
57
=> DragAreaRectangle ;
58
58
59
+ /// <summary> Starting position when dragging a tab.</summary>
60
+ private InteropHelpers . POINT dragStartPoint ;
61
+
62
+ /// <summary> Starting time when dragging a tab. </summary>
63
+ private DateTimeOffset dragStartTime ;
64
+
59
65
public TabBar ( )
60
66
{
61
67
InitializeComponent ( ) ;
@@ -136,6 +142,9 @@ private void TabView_TabDragStarting(TabView sender, TabViewTabDragStartingEvent
136
142
var tabViewItemArgs = ( args . Item as TabBarItem ) . NavigationParameter ;
137
143
args . Data . Properties . Add ( TabPathIdentifier , tabViewItemArgs . Serialize ( ) ) ;
138
144
args . Data . RequestedOperation = DataPackageOperation . Move ;
145
+
146
+ InteropHelpers . GetCursorPos ( out dragStartPoint ) ;
147
+ dragStartTime = DateTimeOffset . UtcNow ;
139
148
}
140
149
141
150
private void TabView_TabStripDragOver ( object sender , DragEventArgs e )
@@ -211,14 +220,20 @@ private void TabView_TabDragCompleted(TabView sender, TabViewTabDragCompletedEve
211
220
212
221
private async void TabView_TabDroppedOutside ( TabView sender , TabViewTabDroppedOutsideEventArgs args )
213
222
{
214
- if ( sender . TabItems . Count == 1 )
215
- {
223
+ InteropHelpers . GetCursorPos ( out var droppedPoint ) ;
224
+ var droppedTime = DateTimeOffset . UtcNow ;
225
+ var dragTime = droppedTime - dragStartTime ;
226
+ var dragDistance = Math . Sqrt ( Math . Pow ( ( dragStartPoint . X - droppedPoint . X ) , 2 ) + Math . Pow ( ( dragStartPoint . Y - droppedPoint . Y ) , 2 ) ) ;
227
+
228
+ if ( sender . TabItems . Count == 1 ||
229
+ ( dragTime . TotalSeconds < 1 &&
230
+ dragDistance < 100 ) )
216
231
return ;
217
- }
218
232
219
233
var indexOfTabViewItem = sender . TabItems . IndexOf ( args . Item ) ;
220
234
var tabViewItemArgs = ( args . Item as TabBarItem ) . NavigationParameter ;
221
235
var selectedTabViewItemIndex = sender . SelectedIndex ;
236
+
222
237
Items . Remove ( args . Item as TabBarItem ) ;
223
238
if ( ! await NavigationHelpers . OpenTabInNewWindowAsync ( tabViewItemArgs . Serialize ( ) ) )
224
239
{
0 commit comments