C# 从上一个位置恢复滚动时,列表框跳到顶部

C# 从上一个位置恢复滚动时,列表框跳到顶部,c#,listbox,windows-phone-8.1,C#,Listbox,Windows Phone 8.1,(Windows Phone 8.1)在我的应用程序中,我有一个带有列表框的主页。NavigationCacheMode设置为required,以便在导航回同一页时保留状态 public MainPage() { this.InitializeComponent(); this.DataContext = this; // cache page this.NavigationCacheMode = NavigationCacheMode.Required; }

(Windows Phone 8.1)在我的应用程序中,我有一个带有列表框的主页。NavigationCacheMode设置为required,以便在导航回同一页时保留状态

public MainPage()
{
    this.InitializeComponent();
    this.DataContext = this;

    // cache page
    this.NavigationCacheMode = NavigationCacheMode.Required;
}
因此,当我转到另一个页面并返回到我的主页时,一切看起来都和我离开时一样。列表框也位于相应的位置。但每当我触摸它,它就会在滚动之前跳到顶部

如何使其在第一次进入顶部之前恢复滚动

编辑:已解决


似乎Listbox在WP8.1中有错误,请改用ListView

我也遇到了同样的问题,并发现主要是选择的ItemsPanelTemplate导致了错误

使用ListView时,标准的ItemsPanelTemplate是ItemsStackPanel,可以正常工作。如果将其更改为VirtualzingStackPanel(ListBox的标准配置),则会出现错误。但仅在Windows Phone上,对于Windows,它的工作方式与预期一致


因此,我假设,当您想使用ListBox而不是ListView时,必须使用ItemStackPanel作为ItemsPanelTemplate,以通过NavigationCacheMode保留滚动位置。

我也遇到了这个错误。有没有办法使用虚拟化面板,但手动恢复滚动位置?是的,这是可能的,但不幸的是,这需要相当多的努力。首先,您必须扫描VisualTree以找到ScrollViewer(结束),它仅在列表呈现完成后才工作。获得ScrollViewer后,您可以提取水平/垂直偏移并保存它。返回该页面时,必须再次扫描VisualTree,在获得ScrollViewer并呈现列表内容后,可以滚动到保存的位置(ScrollViewer.ChangeView)。到目前为止,我还没有找到等待渲染的好方法:/只要NavigationCacheMode设置为Disabled,此解决方案就可以工作。当然,现在它已被禁用,您必须手动跟踪任何要持久化的UI属性。我还没有找到一种将这种技术用于缓存的方法,因为ListView不是在加载时跳转的,而是当您再次触摸它滚动时跳转的。