UWP应用中如何保留DataGrid的滚动位置?
保持UWP DataGrid刷新后的滚动位置
方案1:记录并恢复可见首项(通用场景)
这种方法不依赖行高,适配大多数情况:
获取DataGrid内部的ScrollViewer
DataGrid的滚动控件封装在模板里,需要通过视觉树遍历获取:private ScrollViewer GetDataGridScrollViewer(DataGrid dataGrid) { return FindVisualChild<ScrollViewer>(dataGrid); } private T FindVisualChild<T>(DependencyObject parent) where T : DependencyObject { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++) { var child = VisualTreeHelper.GetChild(parent, i); if (child is T typedChild) return typedChild; var result = FindVisualChild<T>(child); if (result != null) return result; } return null; }刷新前记录可见首项
在重新加载数据前,获取当前可视区域的第一个数据项:var scrollViewer = GetDataGridScrollViewer(YourDataGrid); object firstVisibleItem = null; // 获取可视区域内的第一个容器 var firstContainer = scrollViewer.ItemContainerGenerator.ContainerFromIndex(scrollViewer.FirstVisibleIndex) as FrameworkElement; if (firstContainer != null) { firstVisibleItem = YourDataGrid.ItemFromContainer(firstContainer); }刷新后恢复滚动位置
数据加载完成后,找到记录的项并滚动到对应位置:if (firstVisibleItem != null && YourDataGrid.Items.Contains(firstVisibleItem)) { // 对齐到顶部,确保位置和刷新前一致 YourDataGrid.ScrollIntoView(firstVisibleItem, ScrollIntoViewAlignment.Top); }
方案2:记录滚动偏移量(固定行高场景)
如果DataGrid的行高度固定,直接操作ScrollViewer的偏移量更高效:
// 刷新前记录垂直偏移 var scrollViewer = GetDataGridScrollViewer(YourDataGrid); double savedOffset = scrollViewer.VerticalOffset; // 执行数据库数据加载、更新ItemsSource操作... // 刷新后恢复偏移 scrollViewer.ScrollToVerticalOffset(savedOffset);
关键提示
- 若使用
ObservableCollection,避免直接替换整个集合(会触发DataGrid完全重置),优先选择清空后批量添加;如果必须替换集合,再配合上述滚动恢复逻辑。 - 确保在数据完全绑定完成后执行滚动恢复,可通过
Dispatcher.RunAsync延迟一小段时间,避免因UI未更新导致找不到目标项。
内容的提问来源于stack exchange,提问作者Flarosa
相关产品推荐
相关产品推荐

