private void InvokeOnScroll()
        {
            var shouldReportNegativeOffsets = (TemplatedParent as ScrollViewer)?.ShouldReportNegativeOffsets ?? false;
            // iOS can return, eg, negative values for offset, whereas Windows never will, even for 'elastic' scrolling
            var clampedOffset = shouldReportNegativeOffsets ?
                                ContentOffset :
                                ContentOffset.Clamp(CGPoint.Empty, UpperScrollLimit);

            (TemplatedParent as ScrollViewer)?.OnScrollInternal(clampedOffset.X, clampedOffset.Y, isIntermediate: _isInAnimatedScroll);
        }
        private void InvokeOnScroll()
        {
            var scroller = GetParentScrollViewer();

            if (scroller is null)
            {
                return;
            }

            // iOS can return, eg, negative values for offset, whereas Windows never will, even for 'elastic' scrolling
            var clampedOffset = scroller.ShouldReportNegativeOffsets
                                ? ContentOffset
                                : ContentOffset.Clamp(CGPoint.Empty, UpperScrollLimit);

            scroller.OnScrollInternal(clampedOffset.X, clampedOffset.Y, isIntermediate: _isInAnimatedScroll);
        }