From 4590172e32d91414ced541eed20b84a03f56f934 Mon Sep 17 00:00:00 2001 From: Vijay Nirmal Date: Mon, 26 Jul 2021 02:15:43 +0530 Subject: [PATCH 01/11] Changed SmoothScrollIntoView method to truly asynchronous --- .../ListViewExtensionsPage.xaml.cs | 4 +- ...ListViewExtensions.SmoothScrollIntoView.cs | 61 ++++++++++++------- 2 files changed, 42 insertions(+), 23 deletions(-) diff --git a/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/ListViewExtensions/ListViewExtensionsPage.xaml.cs b/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/ListViewExtensions/ListViewExtensionsPage.xaml.cs index b79849ef196..cb23e89d7b5 100644 --- a/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/ListViewExtensions/ListViewExtensionsPage.xaml.cs +++ b/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/ListViewExtensions/ListViewExtensionsPage.xaml.cs @@ -37,7 +37,7 @@ public void OnXamlRendered(FrameworkElement control) private void Load() { - SampleController.Current.RegisterNewCommand("Start Smooth Scroll", (sender, args) => + SampleController.Current.RegisterNewCommand("Start Smooth Scroll", async (sender, args) => { var index = int.TryParse(IndexInput.Text, out var i) ? i : 0; var itemPlacement = ItemPlacementInput.SelectedItem switch @@ -55,7 +55,7 @@ private void Load() var scrollIfVisibile = ScrollIfVisibileInput.IsChecked ?? true; var additionalHorizontalOffset = int.TryParse(AdditionalHorizontalOffsetInput.Text, out var ho) ? ho : 0; var additionalVerticalOffset = int.TryParse(AdditionalVerticalOffsetInput.Text, out var vo) ? vo : 0; - sampleListView.SmoothScrollIntoViewWithIndexAsync(index, itemPlacement, disableAnimation, scrollIfVisibile, additionalHorizontalOffset, additionalVerticalOffset); + await sampleListView.SmoothScrollIntoViewWithIndexAsync(index, itemPlacement, disableAnimation, scrollIfVisibile, additionalHorizontalOffset, additionalVerticalOffset); }); if (sampleListView != null) diff --git a/Microsoft.Toolkit.Uwp.UI/Extensions/ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs b/Microsoft.Toolkit.Uwp.UI/Extensions/ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs index 419471d959b..6fba693a3e2 100644 --- a/Microsoft.Toolkit.Uwp.UI/Extensions/ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs +++ b/Microsoft.Toolkit.Uwp.UI/Extensions/ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs @@ -26,7 +26,7 @@ public static partial class ListViewExtensions /// Set false to disable scrolling when the corresponding item is in view /// Adds additional horizontal offset /// Adds additional vertical offset - /// Note: Even though this return , it will not wait until the scrolling completes + /// Returns that completes after scrolling public static async Task SmoothScrollIntoViewWithIndexAsync(this ListViewBase listViewBase, int index, ScrollItemPlacement itemPlacement = ScrollItemPlacement.Default, bool disableAnimation = false, bool scrollIfVisible = true, int additionalHorizontalOffset = 0, int additionalVerticalOffset = 0) { if (index > (listViewBase.Items.Count - 1)) @@ -56,15 +56,15 @@ public static async Task SmoothScrollIntoViewWithIndexAsync(this ListViewBase li previousXOffset = scrollViewer.HorizontalOffset; previousYOffset = scrollViewer.VerticalOffset; - var tcs = new TaskCompletionSource(); + var tcs = new TaskCompletionSource(); - void ViewChanged(object obj, ScrollViewerViewChangedEventArgs args) => tcs.TrySetResult(result: null); + void ViewChanged(object obj, ScrollViewerViewChangedEventArgs args) => tcs.TrySetResult(result: default); try { scrollViewer.ViewChanged += ViewChanged; listViewBase.ScrollIntoView(listViewBase.Items[index], ScrollIntoViewAlignment.Leading); - await tcs.Task; + await tcs.Task.ConfigureAwait(true); } finally { @@ -80,20 +80,7 @@ public static async Task SmoothScrollIntoViewWithIndexAsync(this ListViewBase li // Scrolling back to previous position if (isVirtualizing) { - var tcs = new TaskCompletionSource(); - - void ViewChanged(object obj, ScrollViewerViewChangedEventArgs args) => tcs.TrySetResult(result: null); - - try - { - scrollViewer.ViewChanged += ViewChanged; - scrollViewer.ChangeView(previousXOffset, previousYOffset, zoomFactor: null, disableAnimation: true); - await tcs.Task; - } - finally - { - scrollViewer.ViewChanged -= ViewChanged; - } + await scrollViewer.ChangeViewAsync(previousXOffset, previousYOffset, zoomFactor: null, disableAnimation: true).ConfigureAwait(true); } var listViewBaseWidth = listViewBase.ActualWidth; @@ -185,7 +172,7 @@ public static async Task SmoothScrollIntoViewWithIndexAsync(this ListViewBase li } } - scrollViewer.ChangeView(finalXPosition, finalYPosition, zoomFactor: null, disableAnimation); + await scrollViewer.ChangeViewAsync(finalXPosition, finalYPosition, zoomFactor: null, disableAnimation).ConfigureAwait(true); } /// @@ -198,10 +185,42 @@ public static async Task SmoothScrollIntoViewWithIndexAsync(this ListViewBase li /// Set true to disable scrolling when the corresponding item is in view /// Adds additional horizontal offset /// Adds additional vertical offset - /// Note: Even though this return , it will not wait until the scrolling completes + /// Returns that completes after scrolling public static async Task SmoothScrollIntoViewWithItemAsync(this ListViewBase listViewBase, object item, ScrollItemPlacement itemPlacement = ScrollItemPlacement.Default, bool disableAnimation = false, bool scrollIfVisibile = true, int additionalHorizontalOffset = 0, int additionalVerticalOffset = 0) { - await SmoothScrollIntoViewWithIndexAsync(listViewBase, listViewBase.Items.IndexOf(item), itemPlacement, disableAnimation, scrollIfVisibile, additionalHorizontalOffset, additionalVerticalOffset); + await SmoothScrollIntoViewWithIndexAsync(listViewBase, listViewBase.Items.IndexOf(item), itemPlacement, disableAnimation, scrollIfVisibile, additionalHorizontalOffset, additionalVerticalOffset).ConfigureAwait(true); + } + + /// + /// Changes the view of asynchronous. + /// + /// The scroll viewer. + /// The horizontal offset. + /// The vertical offset. + /// The zoom factor. + /// if set to true disable animation. + private static async Task ChangeViewAsync(this ScrollViewer scrollViewer, double? horizontalOffset, double? verticalOffset, float? zoomFactor, bool disableAnimation) + { + var tcs = new TaskCompletionSource(); + + void ViewChanged(object _, ScrollViewerViewChangedEventArgs __) => tcs.TrySetResult(result: default); + + try + { + scrollViewer.ViewChanged += ViewChanged; + scrollViewer.ChangeView(horizontalOffset, verticalOffset, zoomFactor, disableAnimation); + await tcs.Task.ConfigureAwait(true); + } + finally + { + scrollViewer.ViewChanged -= ViewChanged; + } } + + /// + /// Used as a placeholder TResult to indicate that a ]]> has a void TResult + /// + /// + private struct VoidResult { } } } From 6f1869e70dce6ab3a9b10b38be2140772d27ab27 Mon Sep 17 00:00:00 2001 From: Vijay Nirmal Date: Mon, 26 Jul 2021 22:38:25 +0530 Subject: [PATCH 02/11] Fixed SA1502 in VoidResult struct Co-authored-by: Rosario Pulella --- .../ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Microsoft.Toolkit.Uwp.UI/Extensions/ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs b/Microsoft.Toolkit.Uwp.UI/Extensions/ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs index 6fba693a3e2..0efda60a5d8 100644 --- a/Microsoft.Toolkit.Uwp.UI/Extensions/ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs +++ b/Microsoft.Toolkit.Uwp.UI/Extensions/ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs @@ -221,6 +221,8 @@ private static async Task ChangeViewAsync(this ScrollViewer scrollViewer, double /// Used as a placeholder TResult to indicate that a ]]> has a void TResult /// /// - private struct VoidResult { } + private struct VoidResult + { + } } } From 39459998b494e991722fe13406c666e33257d8df Mon Sep 17 00:00:00 2001 From: Vijay Nirmal Date: Tue, 27 Jul 2021 01:36:50 +0530 Subject: [PATCH 03/11] Fixed issue where SmoothScrollIntoView doesn't await until the animation completes --- .../ListViewExtensions.SmoothScrollIntoView.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Microsoft.Toolkit.Uwp.UI/Extensions/ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs b/Microsoft.Toolkit.Uwp.UI/Extensions/ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs index 6fba693a3e2..a71126bee20 100644 --- a/Microsoft.Toolkit.Uwp.UI/Extensions/ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs +++ b/Microsoft.Toolkit.Uwp.UI/Extensions/ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs @@ -203,7 +203,15 @@ private static async Task ChangeViewAsync(this ScrollViewer scrollViewer, double { var tcs = new TaskCompletionSource(); - void ViewChanged(object _, ScrollViewerViewChangedEventArgs __) => tcs.TrySetResult(result: default); + void ViewChanged(object _, ScrollViewerViewChangedEventArgs e) + { + if (e.IsIntermediate) + { + return; + } + + tcs.TrySetResult(result: default); + } try { From 525bc259134ad1da0598c90513fcb9240fa0e022 Mon Sep 17 00:00:00 2001 From: Vijay Nirmal Date: Tue, 27 Jul 2021 10:49:19 +0530 Subject: [PATCH 04/11] Fixed review comments. 1) Remove ConfigureAwait(true), 2) Remove VoidResult --- ...ListViewExtensions.SmoothScrollIntoView.cs | 24 +++++++------------ 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/Microsoft.Toolkit.Uwp.UI/Extensions/ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs b/Microsoft.Toolkit.Uwp.UI/Extensions/ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs index d92740b35b4..d00bf20c219 100644 --- a/Microsoft.Toolkit.Uwp.UI/Extensions/ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs +++ b/Microsoft.Toolkit.Uwp.UI/Extensions/ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs @@ -56,15 +56,15 @@ public static async Task SmoothScrollIntoViewWithIndexAsync(this ListViewBase li previousXOffset = scrollViewer.HorizontalOffset; previousYOffset = scrollViewer.VerticalOffset; - var tcs = new TaskCompletionSource(); + var tcs = new TaskCompletionSource(); - void ViewChanged(object obj, ScrollViewerViewChangedEventArgs args) => tcs.TrySetResult(result: default); + void ViewChanged(object _, ScrollViewerViewChangedEventArgs __) => tcs.TrySetResult(result: default); try { scrollViewer.ViewChanged += ViewChanged; listViewBase.ScrollIntoView(listViewBase.Items[index], ScrollIntoViewAlignment.Leading); - await tcs.Task.ConfigureAwait(true); + await tcs.Task; } finally { @@ -80,7 +80,7 @@ public static async Task SmoothScrollIntoViewWithIndexAsync(this ListViewBase li // Scrolling back to previous position if (isVirtualizing) { - await scrollViewer.ChangeViewAsync(previousXOffset, previousYOffset, zoomFactor: null, disableAnimation: true).ConfigureAwait(true); + await scrollViewer.ChangeViewAsync(previousXOffset, previousYOffset, zoomFactor: null, disableAnimation: true); } var listViewBaseWidth = listViewBase.ActualWidth; @@ -172,7 +172,7 @@ public static async Task SmoothScrollIntoViewWithIndexAsync(this ListViewBase li } } - await scrollViewer.ChangeViewAsync(finalXPosition, finalYPosition, zoomFactor: null, disableAnimation).ConfigureAwait(true); + await scrollViewer.ChangeViewAsync(finalXPosition, finalYPosition, zoomFactor: null, disableAnimation); } /// @@ -188,7 +188,7 @@ public static async Task SmoothScrollIntoViewWithIndexAsync(this ListViewBase li /// Returns that completes after scrolling public static async Task SmoothScrollIntoViewWithItemAsync(this ListViewBase listViewBase, object item, ScrollItemPlacement itemPlacement = ScrollItemPlacement.Default, bool disableAnimation = false, bool scrollIfVisibile = true, int additionalHorizontalOffset = 0, int additionalVerticalOffset = 0) { - await SmoothScrollIntoViewWithIndexAsync(listViewBase, listViewBase.Items.IndexOf(item), itemPlacement, disableAnimation, scrollIfVisibile, additionalHorizontalOffset, additionalVerticalOffset).ConfigureAwait(true); + await SmoothScrollIntoViewWithIndexAsync(listViewBase, listViewBase.Items.IndexOf(item), itemPlacement, disableAnimation, scrollIfVisibile, additionalHorizontalOffset, additionalVerticalOffset); } /// @@ -201,7 +201,7 @@ public static async Task SmoothScrollIntoViewWithItemAsync(this ListViewBase lis /// if set to true disable animation. private static async Task ChangeViewAsync(this ScrollViewer scrollViewer, double? horizontalOffset, double? verticalOffset, float? zoomFactor, bool disableAnimation) { - var tcs = new TaskCompletionSource(); + var tcs = new TaskCompletionSource(); void ViewChanged(object _, ScrollViewerViewChangedEventArgs e) { @@ -217,20 +217,12 @@ void ViewChanged(object _, ScrollViewerViewChangedEventArgs e) { scrollViewer.ViewChanged += ViewChanged; scrollViewer.ChangeView(horizontalOffset, verticalOffset, zoomFactor, disableAnimation); - await tcs.Task.ConfigureAwait(true); + await tcs.Task; } finally { scrollViewer.ViewChanged -= ViewChanged; } } - - /// - /// Used as a placeholder TResult to indicate that a ]]> has a void TResult - /// - /// - private struct VoidResult - { - } } } From b1033fb2115229a1f6db465df916fcc7c2e7e4db Mon Sep 17 00:00:00 2001 From: Vijay Nirmal Date: Tue, 27 Jul 2021 15:11:11 +0530 Subject: [PATCH 05/11] Added Scroll indicator --- .../ListViewExtensionsPage.xaml | 21 +++++++++++++------ .../ListViewExtensionsPage.xaml.cs | 18 ++++++++++++++++ ...ListViewExtensions.SmoothScrollIntoView.cs | 6 ++++++ 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/ListViewExtensions/ListViewExtensionsPage.xaml b/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/ListViewExtensions/ListViewExtensionsPage.xaml index 625285f44be..a39bc773a57 100644 --- a/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/ListViewExtensions/ListViewExtensionsPage.xaml +++ b/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/ListViewExtensions/ListViewExtensionsPage.xaml @@ -35,14 +35,16 @@ - + + Text="100" + Margin="0,10,0,0" /> + SelectedIndex="0" + Margin="0,10,0,0" > Default Left Top @@ -52,18 +54,25 @@ + IsChecked="False" + Margin="0,10,0,0" /> + Text="0" + Margin="0,10,0,0" /> + Text="0" + Margin="0,10,0,0" /> + + + + \ No newline at end of file diff --git a/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/ListViewExtensions/ListViewExtensionsPage.xaml.cs b/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/ListViewExtensions/ListViewExtensionsPage.xaml.cs index cb23e89d7b5..134be3719dc 100644 --- a/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/ListViewExtensions/ListViewExtensionsPage.xaml.cs +++ b/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/ListViewExtensions/ListViewExtensionsPage.xaml.cs @@ -6,9 +6,11 @@ using System.Collections.ObjectModel; using System.Windows.Input; using Microsoft.Toolkit.Uwp.UI; +using Windows.UI; using Windows.UI.Popups; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Media; namespace Microsoft.Toolkit.Uwp.SampleApp.SamplePages { @@ -55,7 +57,9 @@ private void Load() var scrollIfVisibile = ScrollIfVisibileInput.IsChecked ?? true; var additionalHorizontalOffset = int.TryParse(AdditionalHorizontalOffsetInput.Text, out var ho) ? ho : 0; var additionalVerticalOffset = int.TryParse(AdditionalVerticalOffsetInput.Text, out var vo) ? vo : 0; + UpdateScrollIndicator(true); await sampleListView.SmoothScrollIntoViewWithIndexAsync(index, itemPlacement, disableAnimation, scrollIfVisibile, additionalHorizontalOffset, additionalVerticalOffset); + UpdateScrollIndicator(false); }); if (sampleListView != null) @@ -64,6 +68,20 @@ private void Load() } } + private void UpdateScrollIndicator(bool isScrolling) + { + if (isScrolling) + { + ScrollIndicatorTest.Text = "Scroll started"; + ScrollIndicator.Fill = new SolidColorBrush(Colors.Green); + } + else + { + ScrollIndicator.Fill = new SolidColorBrush(Colors.Red); + ScrollIndicatorTest.Text = "Scroll completed"; + } + } + private ObservableCollection GetOddEvenSource(int count) { var oddEvenSource = new ObservableCollection(); diff --git a/Microsoft.Toolkit.Uwp.UI/Extensions/ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs b/Microsoft.Toolkit.Uwp.UI/Extensions/ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs index d00bf20c219..f51cc87e2b2 100644 --- a/Microsoft.Toolkit.Uwp.UI/Extensions/ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs +++ b/Microsoft.Toolkit.Uwp.UI/Extensions/ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs @@ -201,6 +201,12 @@ public static async Task SmoothScrollIntoViewWithItemAsync(this ListViewBase lis /// if set to true disable animation. private static async Task ChangeViewAsync(this ScrollViewer scrollViewer, double? horizontalOffset, double? verticalOffset, float? zoomFactor, bool disableAnimation) { + // MUST check this an return immediately, otherwise this async task will never completes because ViewChanged event won't triggered + if (horizontalOffset == scrollViewer.HorizontalOffset && verticalOffset == scrollViewer.VerticalOffset) + { + return; + } + var tcs = new TaskCompletionSource(); void ViewChanged(object _, ScrollViewerViewChangedEventArgs e) From 8a5774e6a556ba0e04222d9ec225dd340224fca3 Mon Sep 17 00:00:00 2001 From: Vijay Nirmal Date: Tue, 27 Jul 2021 15:15:40 +0530 Subject: [PATCH 06/11] Fixed typos --- .../ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Microsoft.Toolkit.Uwp.UI/Extensions/ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs b/Microsoft.Toolkit.Uwp.UI/Extensions/ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs index f51cc87e2b2..74b8b699bca 100644 --- a/Microsoft.Toolkit.Uwp.UI/Extensions/ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs +++ b/Microsoft.Toolkit.Uwp.UI/Extensions/ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs @@ -201,7 +201,7 @@ public static async Task SmoothScrollIntoViewWithItemAsync(this ListViewBase lis /// if set to true disable animation. private static async Task ChangeViewAsync(this ScrollViewer scrollViewer, double? horizontalOffset, double? verticalOffset, float? zoomFactor, bool disableAnimation) { - // MUST check this an return immediately, otherwise this async task will never completes because ViewChanged event won't triggered + // MUST check this and return immediately, otherwise this async task will never completes because ViewChanged event won't triggered if (horizontalOffset == scrollViewer.HorizontalOffset && verticalOffset == scrollViewer.VerticalOffset) { return; From 4ee302dc411c9d8a4d39a78478c0920c0ea5ca60 Mon Sep 17 00:00:00 2001 From: Vijay Nirmal Date: Tue, 27 Jul 2021 15:16:10 +0530 Subject: [PATCH 07/11] Fixed typo --- .../ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Microsoft.Toolkit.Uwp.UI/Extensions/ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs b/Microsoft.Toolkit.Uwp.UI/Extensions/ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs index 74b8b699bca..4833e54408b 100644 --- a/Microsoft.Toolkit.Uwp.UI/Extensions/ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs +++ b/Microsoft.Toolkit.Uwp.UI/Extensions/ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs @@ -201,7 +201,7 @@ public static async Task SmoothScrollIntoViewWithItemAsync(this ListViewBase lis /// if set to true disable animation. private static async Task ChangeViewAsync(this ScrollViewer scrollViewer, double? horizontalOffset, double? verticalOffset, float? zoomFactor, bool disableAnimation) { - // MUST check this and return immediately, otherwise this async task will never completes because ViewChanged event won't triggered + // MUST check this and return immediately, otherwise this async task will never complete because ViewChanged event won't get triggered if (horizontalOffset == scrollViewer.HorizontalOffset && verticalOffset == scrollViewer.VerticalOffset) { return; From 625716b23f7ad915ad93dd1fde4909b40b82b148 Mon Sep 17 00:00:00 2001 From: Vijay Nirmal Date: Tue, 27 Jul 2021 20:29:25 +0530 Subject: [PATCH 08/11] Scroll indicators test change in code behind Co-authored-by: Rosario Pulella --- .../ListViewExtensions/ListViewExtensionsPage.xaml.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/ListViewExtensions/ListViewExtensionsPage.xaml.cs b/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/ListViewExtensions/ListViewExtensionsPage.xaml.cs index 134be3719dc..cd547d2bd77 100644 --- a/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/ListViewExtensions/ListViewExtensionsPage.xaml.cs +++ b/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/ListViewExtensions/ListViewExtensionsPage.xaml.cs @@ -72,13 +72,13 @@ private void UpdateScrollIndicator(bool isScrolling) { if (isScrolling) { - ScrollIndicatorTest.Text = "Scroll started"; + ScrollIndicatorTest.Text = "Scrolling"; ScrollIndicator.Fill = new SolidColorBrush(Colors.Green); } else { ScrollIndicator.Fill = new SolidColorBrush(Colors.Red); - ScrollIndicatorTest.Text = "Scroll completed"; + ScrollIndicatorTest.Text = "Not Scolling"; } } @@ -121,4 +121,4 @@ private static async void OnExecuteSampleCommand(string item) await new MessageDialog($"You clicked {item} via the 'ListViewExtensions.Command' binding", "Item Clicked").ShowAsync(); } } -} \ No newline at end of file +} From a09e203b5cd480b32a162f803d92c54fa00ab92d Mon Sep 17 00:00:00 2001 From: Vijay Nirmal Date: Tue, 27 Jul 2021 20:29:38 +0530 Subject: [PATCH 09/11] Scroll indicators test change in xaml Co-authored-by: Rosario Pulella --- .../ListViewExtensions/ListViewExtensionsPage.xaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/ListViewExtensions/ListViewExtensionsPage.xaml b/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/ListViewExtensions/ListViewExtensionsPage.xaml index a39bc773a57..bb50bbcf3e6 100644 --- a/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/ListViewExtensions/ListViewExtensionsPage.xaml +++ b/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/ListViewExtensions/ListViewExtensionsPage.xaml @@ -71,8 +71,8 @@ Margin="0,10,0,0" /> - + - \ No newline at end of file + From 4b70980f2d12e2e9a58a5ade8857f8114f76ff87 Mon Sep 17 00:00:00 2001 From: Vijay Nirmal Date: Tue, 27 Jul 2021 22:36:40 +0530 Subject: [PATCH 10/11] Fixed Task not completing issue --- .../ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Microsoft.Toolkit.Uwp.UI/Extensions/ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs b/Microsoft.Toolkit.Uwp.UI/Extensions/ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs index 4833e54408b..e0edbaed0e2 100644 --- a/Microsoft.Toolkit.Uwp.UI/Extensions/ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs +++ b/Microsoft.Toolkit.Uwp.UI/Extensions/ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs @@ -201,6 +201,9 @@ public static async Task SmoothScrollIntoViewWithItemAsync(this ListViewBase lis /// if set to true disable animation. private static async Task ChangeViewAsync(this ScrollViewer scrollViewer, double? horizontalOffset, double? verticalOffset, float? zoomFactor, bool disableAnimation) { + horizontalOffset = horizontalOffset > scrollViewer.ScrollableWidth ? scrollViewer.ScrollableWidth : horizontalOffset; + verticalOffset = verticalOffset > scrollViewer.ScrollableHeight ? scrollViewer.ScrollableHeight : verticalOffset; + // MUST check this and return immediately, otherwise this async task will never complete because ViewChanged event won't get triggered if (horizontalOffset == scrollViewer.HorizontalOffset && verticalOffset == scrollViewer.VerticalOffset) { From 70d7b0e498f5d261fc7b5d3340d8537e8d5e4027 Mon Sep 17 00:00:00 2001 From: Vijay Nirmal Date: Tue, 27 Jul 2021 23:46:14 +0530 Subject: [PATCH 11/11] Fixed Task not completing issue when offset is negative --- ...ListViewExtensions.SmoothScrollIntoView.cs | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/Microsoft.Toolkit.Uwp.UI/Extensions/ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs b/Microsoft.Toolkit.Uwp.UI/Extensions/ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs index e0edbaed0e2..c32bf5c4d88 100644 --- a/Microsoft.Toolkit.Uwp.UI/Extensions/ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs +++ b/Microsoft.Toolkit.Uwp.UI/Extensions/ListViewBase/ListViewExtensions.SmoothScrollIntoView.cs @@ -201,8 +201,23 @@ public static async Task SmoothScrollIntoViewWithItemAsync(this ListViewBase lis /// if set to true disable animation. private static async Task ChangeViewAsync(this ScrollViewer scrollViewer, double? horizontalOffset, double? verticalOffset, float? zoomFactor, bool disableAnimation) { - horizontalOffset = horizontalOffset > scrollViewer.ScrollableWidth ? scrollViewer.ScrollableWidth : horizontalOffset; - verticalOffset = verticalOffset > scrollViewer.ScrollableHeight ? scrollViewer.ScrollableHeight : verticalOffset; + if (horizontalOffset > scrollViewer.ScrollableWidth) + { + horizontalOffset = scrollViewer.ScrollableWidth; + } + else if (horizontalOffset < 0) + { + horizontalOffset = 0; + } + + if (verticalOffset > scrollViewer.ScrollableHeight) + { + verticalOffset = scrollViewer.ScrollableHeight; + } + else if (verticalOffset < 0) + { + verticalOffset = 0; + } // MUST check this and return immediately, otherwise this async task will never complete because ViewChanged event won't get triggered if (horizontalOffset == scrollViewer.HorizontalOffset && verticalOffset == scrollViewer.VerticalOffset)