コード例 #1
0
        public static void ScrollToElement(this ScrollViewer scrollViewer, UIElement element,
    bool isVerticalScrolling = true, bool smoothScrolling = true, float? zoomFactor = null)
        {
            var transform = element.TransformToVisual((UIElement)scrollViewer.Content);
            var position = transform.TransformPoint(new Point(0, 0));

            if (isVerticalScrolling)
            {
                scrollViewer.ChangeView(null, position.Y, zoomFactor, !smoothScrolling);
            }
            else
            {
                scrollViewer.ChangeView(position.X, null, zoomFactor, !smoothScrolling);
            }
        }
コード例 #2
0
        /// <summary>
        /// Scrolls to horizontal offset asynchronously.
        /// </summary>
        /// <param name="scrollViewer">The scroll viewer.</param>
        /// <param name="offset">The offset.</param>
        /// <returns>The task that completes when scrolling is complete.</returns>
        public static async Task ScrollToHorizontalOffsetAsync(this ScrollViewer scrollViewer, double offset)
        {
            if (offset < 0)
                offset = 0;

            if (offset > scrollViewer.ScrollableWidth)
                offset = scrollViewer.ScrollableWidth;

            var currentOffset = scrollViewer.HorizontalOffset;
            // ReSharper disable CompareOfFloatsByEqualityOperator
            if (offset == currentOffset)
                return;

#if WIN81
            if (!scrollViewer.ChangeView(offset, null, null, true))
            {
                return;
            }
#else
            scrollViewer.ScrollToHorizontalOffset(offset);
#endif

            if (scrollViewer.HorizontalOffset == offset)
                return;

            if (scrollViewer.HorizontalOffset != currentOffset)
                return;
            // ReSharper restore CompareOfFloatsByEqualityOperator

            await EventAsync.FromEvent<ScrollViewerViewChangedEventArgs>(
                eh => scrollViewer.ViewChanged += eh,
                eh => scrollViewer.ViewChanged -= eh);
        } 
コード例 #3
0
        /// <summary>
        /// Scrolls to vertical offset asynchronously.
        /// </summary>
        /// <param name="scrollViewer">The scroll viewer.</param>
        /// <param name="offset">The offset.</param>
        /// <returns>The task that completes when scrolling is complete.</returns>
        public static async Task ScrollToVerticalOffsetAsync(this ScrollViewer scrollViewer, double offset)
        {
            if (offset < 0)
                offset = 0;

            if (offset > scrollViewer.ScrollableHeight)
                offset = scrollViewer.ScrollableHeight;

            var currentOffset = scrollViewer.VerticalOffset;
            // ReSharper disable CompareOfFloatsByEqualityOperator
            if (offset == currentOffset)
                return;

            if (!scrollViewer.ChangeView(null, offset, null))
            {
                return;
            }

            if (scrollViewer.VerticalOffset == offset)
                return;

            if (scrollViewer.VerticalOffset != currentOffset)
                return;
            // ReSharper restore CompareOfFloatsByEqualityOperator

            await EventAsync.FromEventAsync<ScrollViewerViewChangedEventArgs>(
                eh => scrollViewer.ViewChanged += eh,
                eh => scrollViewer.ViewChanged -= eh);
        } 
コード例 #4
0
        /// <summary>
        /// Scroll the ScrollViewer to the bottom.
        /// </summary>
        /// <param name="viewer">The ScrollViewer.</param>
        public static void ScrollToBottom(this ScrollViewer viewer)
        {
            Debug.Assert(viewer != null, "viewer should not be null!");
#if WIN81
            viewer.ChangeView(null, viewer.ExtentHeight, null);
#else
            viewer.ScrollToVerticalOffset(viewer.ExtentHeight);
#endif
        }
コード例 #5
0
        /// <summary>
        /// Scroll the ScrollViewer to the top.
        /// </summary>
        /// <param name="viewer">The ScrollViewer.</param>
        public static void ScrollToTop(this ScrollViewer viewer)
        {
            Debug.Assert(viewer != null, "viewer should not be null!");
#if WIN81
            viewer.ChangeView(null, 0, null);
#else
            viewer.ScrollToVerticalOffset(0);
#endif
        }
コード例 #6
0
 /// <summary>
 /// Scroll the ScrollViewer to the bottom.
 /// </summary>
 /// <param name="viewer">The ScrollViewer.</param>
 public static void ScrollToBottom(this ScrollViewer viewer)
 {
     Debug.Assert(viewer != null, "viewer should not be null!");
     viewer.ChangeView(null, viewer.ExtentHeight, null);
 }
コード例 #7
0
 /// <summary>
 /// Scroll the ScrollViewer to the top.
 /// </summary>
 /// <param name="viewer">The ScrollViewer.</param>
 public static void ScrollToTop(this ScrollViewer viewer)
 {
     Debug.Assert(viewer != null, "viewer should not be null!");
     viewer.ChangeView(null, 0, null);
 }
コード例 #8
0
        public static async Task ChangeViewAsync(this ScrollViewer scrollViewer, double? horizontalOffset, double? verticalOffset, bool disableAnimation)
        {
            var tcs = new TaskCompletionSource<object>();

            EventHandler<ScrollViewerViewChangedEventArgs> viewChanged = (s, e) => tcs.TrySetResult(null);
            try
            {
                scrollViewer.ViewChanged += viewChanged;
                scrollViewer.ChangeView(horizontalOffset, verticalOffset, null, disableAnimation);
                await tcs.Task;
            }
            finally
            {
                scrollViewer.ViewChanged -= viewChanged;
            }
        }