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); } }
/// <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); }
/// <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); }
/// <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 }
/// <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 }
/// <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); }
/// <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); }
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; } }