1
1
using System ;
2
2
using System . Globalization ;
3
3
using System . Linq ;
4
+ using Avalonia . Controls . Presenters ;
4
5
using Avalonia . Input ;
6
+ using Avalonia . Input . GestureRecognizers ;
5
7
using Avalonia . Interactivity ;
6
8
using Avalonia . Media ;
7
9
using Avalonia . VisualTree ;
@@ -60,6 +62,7 @@ public class DateTimePickerPanel : Panel, ILogicalScrollable
60
62
private Vector _offset ;
61
63
private bool _hasInit ;
62
64
private bool _suppressUpdateOffset ;
65
+ private ScrollContentPresenter ? _parentScroller ;
63
66
64
67
public DateTimePickerPanel ( )
65
68
{
@@ -255,6 +258,8 @@ public Vector Offset
255
258
_suppressUpdateOffset = true ;
256
259
SelectedValue = ( int ) newSel * Increment + MinimumValue ;
257
260
_suppressUpdateOffset = false ;
261
+
262
+ System . Diagnostics . Debug . WriteLine ( $ "Offset: { _offset } ItemHeight: { ItemHeight } ") ;
258
263
}
259
264
}
260
265
@@ -270,7 +275,7 @@ public Vector Offset
270
275
271
276
public Size Extent => _extent ;
272
277
273
- public Size Viewport => new Size ( 0 , ItemHeight ) ;
278
+ public Size Viewport => Bounds . Size ;
274
279
275
280
public event EventHandler ScrollInvalidated ;
276
281
@@ -341,6 +346,20 @@ protected override Size ArrangeOverride(Size finalSize)
341
346
return finalSize ;
342
347
}
343
348
349
+ protected override void OnAttachedToVisualTree ( VisualTreeAttachmentEventArgs e )
350
+ {
351
+ base . OnAttachedToVisualTree ( e ) ;
352
+ _parentScroller = this . GetVisualParent ( ) as ScrollContentPresenter ;
353
+ _parentScroller ? . AddHandler ( Gestures . ScrollGestureEndedEvent , OnScrollGestureEnded ) ;
354
+ }
355
+
356
+ protected override void OnDetachedFromVisualTree ( VisualTreeAttachmentEventArgs e )
357
+ {
358
+ base . OnDetachedFromVisualTree ( e ) ;
359
+ _parentScroller ? . RemoveHandler ( Gestures . ScrollGestureEndedEvent , OnScrollGestureEnded ) ;
360
+ _parentScroller = null ;
361
+ }
362
+
344
363
protected override void OnKeyDown ( KeyEventArgs e )
345
364
{
346
365
switch ( e . Key )
@@ -554,5 +573,15 @@ public void RaiseScrollInvalidated(EventArgs e)
554
573
{
555
574
ScrollInvalidated ? . Invoke ( this , e ) ;
556
575
}
576
+
577
+ private void OnScrollGestureEnded ( object ? sender , ScrollGestureEndedEventArgs e )
578
+ {
579
+ var snapY = Math . Round ( Offset . Y / ItemHeight ) * ItemHeight ;
580
+
581
+ if ( snapY != Offset . Y )
582
+ {
583
+ Offset = Offset . WithY ( snapY ) ;
584
+ }
585
+ }
557
586
}
558
587
}
0 commit comments