保存ScrollerViewer状态在Frame.Navigate

本文关键字:Frame Navigate 状态 ScrollerViewer 保存 | 更新日期: 2023-09-27 18:05:18

我需要保存我的ScrollViewer的位置,这样当我导航到一个页面并点击后退箭头时,它仍然会在它原来的位置。

我用:

protected override void LoadState(Object navigationParameter, Dictionary<String, Object> pageState)
        {
            base.LoadState(navigationParameter, pageState);
            if (pageState != null && pageState.ContainsKey("ScrollerPosition"))
            {
                mainScrollViewer.ScrollToHorizontalOffset((double) pageState["ScrollerPosition"]);
            }
        }

protected override void SaveState(Dictionary<String, Object> pageState)
        {
            base.SaveState(pageState);
            pageState["ScrollerPosition"] = mainScrollViewer.HorizontalOffset;
        }

,但它没有恢复到原来的状态。我做错了什么?

保存ScrollerViewer状态在Frame.Navigate

问题可能是在加载任何数据之前调用LoadState。如果是这种情况,没有内容可以滚动,所以您的ScrollToHorizontalOffset调用没有效果。

你没有任何关于如何加载数据的细节,所以我不能给出具体的建议。但是,一般的解决方案是确保在调用设置滚动位置之前加载所有数据。

恢复滚动查看器的位置在Loaded事件中。在构造函数中添加处理程序:

scrollViewer.Loaded += (sv,event) => ScrollViewerLoaded(sv, event);

(或者通过XAML)

保存状态,因为你有在SaveState()。加载LoadState()中的值,因为你有,但不是使用值立即缓存它,直到你得到加载事件:

void ScrollViewerLoaded(Object sender, RoutedEventArgs event)
{
    mainScrollViewer.ScrollToHorizontalOffset(cachedScrollPosition);
}