66using Windows . UI ;
77#else
88using Microsoft . UI ;
9+ using Microsoft . UI . Xaml . Controls . Primitives ;
910#endif
1011
1112namespace CommunityToolkit . WinUI . Controls ;
@@ -18,7 +19,9 @@ private void Thumb_DragStarted(object sender, DragStartedEventArgs e)
1819 return ;
1920
2021 _draggingThumb = thumb ;
21- _dragStartPosition = Canvas . GetLeft ( thumb ) ;
22+ var xStart = Canvas . GetLeft ( thumb ) ;
23+ var yStart = e . VerticalOffset ;
24+ _dragPosition = new Point ( xStart , yStart ) ;
2225
2326 OnThumbDragStarted ( e ) ;
2427 }
@@ -31,10 +34,10 @@ private void Thumb_DragDelta(object sender, DragDeltaEventArgs e)
3134 if ( sender is not GradientSliderThumb thumb )
3235 return ;
3336
34- _dragStartPosition += e . HorizontalChange ;
35- var newPos = _dragStartPosition / ( _containerCanvas . ActualWidth - thumb . ActualWidth ) ;
36- thumb . GradientStop . Offset = Math . Clamp ( newPos , 0 , 1 ) ;
37- UpdateThumbPosition ( thumb ) ;
37+ _dragPosition . X += e . HorizontalChange ;
38+ _dragPosition . Y += e . VerticalChange ;
39+
40+ HandleThumbDragging ( thumb , _dragPosition ) ;
3841 }
3942
4043 private void Thumb_DragCompleted ( object sender , DragCompletedEventArgs e )
@@ -63,22 +66,21 @@ private void ContainerCanvas_PointerMoved(object sender, PointerRoutedEventArgs
6366 if ( _containerCanvas is null || _placeholderThumb is null )
6467 return ;
6568
66- var position = e . GetCurrentPoint ( _containerCanvas ) . Position . X ;
69+ var position = e . GetCurrentPoint ( _containerCanvas ) . Position ;
70+ var posX = position . X ;
6771
6872 if ( _draggingThumb is null )
6973 {
7074 // NOTE: This check could be made O(log(n)) by tracking the thumbs positions in a sorted list and running a binary search
71- _placeholderThumb . IsEnabled = ! IsPointerOverThumb ( position ) ;
75+ _placeholderThumb . IsEnabled = ! IsPointerOverThumb ( posX ) ;
7276
73- var thumbPosition = position - _placeholderThumb . ActualWidth / 2 ;
77+ var thumbPosition = posX - _placeholderThumb . ActualWidth / 2 ;
7478 thumbPosition = Math . Clamp ( thumbPosition , 0 , _containerCanvas . ActualWidth - _placeholderThumb . ActualWidth ) ;
7579 Canvas . SetLeft ( _placeholderThumb , thumbPosition ) ;
7680 }
7781 else if ( _draggingThumb . PointerCaptures ? . Count is null or 0 )
7882 {
79- var newPos = ( position - ( _draggingThumb . ActualWidth / 2 ) ) / ( _containerCanvas . ActualWidth - _draggingThumb . ActualWidth ) ;
80- _draggingThumb . GradientStop . Offset = Math . Clamp ( newPos , 0 , 1 ) ;
81- UpdateThumbPosition ( _draggingThumb ) ;
83+ HandleThumbDragging ( _draggingThumb , position ) ;
8284 }
8385 }
8486
@@ -128,7 +130,6 @@ private void ContainerCanvas_PointerReleased(object sender, PointerRoutedEventAr
128130 _containerCanvas . ReleasePointerCapture ( e . Pointer ) ;
129131
130132 OnValueChanged ( ) ;
131-
132133 }
133134
134135 private bool IsPointerOverThumb ( double position )
@@ -148,4 +149,14 @@ private bool IsPointerOverThumb(double position)
148149
149150 return false ;
150151 }
152+
153+ private void HandleThumbDragging ( GradientSliderThumb thumb , Point position )
154+ {
155+ if ( _containerCanvas is null )
156+ return ;
157+
158+ var newPos = position . X / ( _containerCanvas . ActualWidth - thumb . ActualWidth ) ;
159+ thumb . GradientStop . Offset = Math . Clamp ( newPos , 0 , 1 ) ;
160+ UpdateThumbPosition ( thumb ) ;
161+ }
151162}
0 commit comments