Skip to content

Commit c79b2cb

Browse files
committed
Feature: Keep scroll offset when changing item size (#14914)
1 parent 6eca67c commit c79b2cb

File tree

4 files changed

+27
-4
lines changed

4 files changed

+27
-4
lines changed

src/Files.App/Views/Layouts/ColumnLayoutPage.xaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@
191191
IsRightTapEnabled="True"
192192
IsTabStop="True"
193193
ItemsSource="{x:Bind CollectionViewSource.View, Mode=OneWay}"
194+
Loaded="FileList_Loaded"
194195
PreviewKeyDown="FileList_PreviewKeyDown"
195196
RightTapped="FileList_RightTapped"
196197
ScrollViewer.IsScrollInertiaEnabled="True"

src/Files.App/Views/Layouts/ColumnLayoutPage.xaml.cs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public sealed partial class ColumnLayoutPage : BaseGroupableLayoutPage
4040

4141
protected override ListViewBase ListViewBase => FileList;
4242
protected override SemanticZoom RootZoom => RootGridZoom;
43-
43+
public ScrollViewer? ContentScroller { get; private set; }
4444

4545
/// <summary>
4646
/// Row height in the Columns View
@@ -66,6 +66,11 @@ public ColumnLayoutPage() : base()
6666

6767
// Methods
6868

69+
private void FileList_Loaded(object sender, RoutedEventArgs e)
70+
{
71+
ContentScroller = FileList.FindDescendant<ScrollViewer>(x => x.Name == "ScrollViewer");
72+
}
73+
6974
private void ColumnViewBase_GotFocus(object sender, RoutedEventArgs e)
7075
{
7176
if (FileList.SelectedItem == null && openedFolderPresenter != null)
@@ -167,14 +172,18 @@ protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
167172

168173
private void LayoutSettingsService_PropertyChanged(object? sender, PropertyChangedEventArgs e)
169174
{
170-
// TODO keep scroll position when changing styles (see details view)
171-
172175
if (e.PropertyName == nameof(ILayoutSettingsService.ColumnsViewSize))
173176
{
177+
// Get current scroll position
178+
var previousOffset = ContentScroller?.VerticalOffset;
179+
174180
NotifyPropertyChanged(nameof(RowHeight));
175181

176182
// Update the container style to match the item size
177183
SetItemContainerStyle();
184+
185+
// Restore correct scroll position
186+
ContentScroller?.ChangeView(null, previousOffset, null);
178187
}
179188
}
180189

src/Files.App/Views/Layouts/GridLayoutPage.xaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -778,6 +778,7 @@
778778
IsTabStop="True"
779779
ItemContainerTransitions="{x:Null}"
780780
ItemsSource="{x:Bind CollectionViewSource.View, Mode=OneWay}"
781+
Loaded="FileList_Loaded"
781782
PreviewKeyDown="FileList_PreviewKeyDown"
782783
ScrollViewer.IsHorizontalScrollChainingEnabled="False"
783784
SelectionChanged="FileList_SelectionChanged"

src/Files.App/Views/Layouts/GridLayoutPage.xaml.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ public sealed partial class GridLayoutPage : BaseGroupableLayoutPage
2828

2929
// Properties
3030

31+
public ScrollViewer? ContentScroller { get; private set; }
32+
3133
protected override ListViewBase ListViewBase => FileList;
3234
protected override SemanticZoom RootZoom => RootGridZoom;
3335

@@ -147,7 +149,9 @@ protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
147149

148150
private void LayoutSettingsService_PropertyChanged(object? sender, PropertyChangedEventArgs e)
149151
{
150-
// TODO keep scroll position when changing styles (see details view)
152+
// Get current scroll position
153+
var previousHorizontalOffset = ContentScroller?.HorizontalOffset;
154+
var previousVerticalOffset = ContentScroller?.VerticalOffset;
151155

152156
if (e.PropertyName == nameof(ILayoutSettingsService.ListViewSize))
153157
{
@@ -175,6 +179,9 @@ private void LayoutSettingsService_PropertyChanged(object? sender, PropertyChang
175179

176180
FolderSettings_IconHeightChanged();
177181
}
182+
183+
// Restore correct scroll position
184+
ContentScroller?.ChangeView(previousHorizontalOffset, previousVerticalOffset, null);
178185
}
179186

180187
private async void FolderSettings_LayoutModeChangeRequested(object? sender, LayoutModeEventArgs e)
@@ -249,6 +256,11 @@ private void SetItemContainerStyle()
249256
}
250257
}
251258

259+
private void FileList_Loaded(object sender, RoutedEventArgs e)
260+
{
261+
ContentScroller = FileList.FindDescendant<ScrollViewer>(x => x.Name == "ScrollViewer");
262+
}
263+
252264
protected override void FileList_SelectionChanged(object sender, SelectionChangedEventArgs e)
253265
{
254266
base.FileList_SelectionChanged(sender, e);

0 commit comments

Comments
 (0)