Javascript 在WinJS.UI.ListView中设置滚动位置

Javascript 在WinJS.UI.ListView中设置滚动位置,javascript,listview,microsoft-metro,windows-store-apps,winjs,Javascript,Listview,Microsoft Metro,Windows Store Apps,Winjs,我想在特定项目上自动滚动我的ListView。ListView必须自动滚动到其索引中的项目 listView.ensureVisible(itemIndex); 但它不起作用。另一种选择: yourListView.currentItem = { index: 8, hasFocus: true, showFocus: true } 它也失败了 如何解决这个问题?通常,您必须在对msSetImmediate的调用中结束对EnsureRevible(index)的调用。不知道为什么会这样,可

我想在特定项目上自动滚动我的ListView。ListView必须自动滚动到其索引中的项目

listView.ensureVisible(itemIndex); 
但它不起作用。另一种选择:

yourListView.currentItem = { index: 8, hasFocus: true, showFocus: true }
它也失败了


如何解决这个问题?

通常,您必须在对msSetImmediate的调用中结束对
EnsureRevible(index)
的调用。不知道为什么会这样,可能是个bug,但对我来说很有效。例如:

msSetImmediate(function (){ listView.ensureVisible(4);} );
如果您查看(MSSetimmedia是Microsoft特定的实现)的文档,该功能描述如下:

请求在当前或挂起的任务(如事件或屏幕更新)完成时调用函数

这听起来有点道理,因为它可以确保在调用确保项目可见之前,所有列表视图动画等都已完成


查看此线程以获取相关帖子:

通常,您必须将对
的调用打包为对mssetimediate的调用,以确保可修改(索引)
。不知道为什么会这样,可能是个bug,但对我来说很有效。例如:

msSetImmediate(function (){ listView.ensureVisible(4);} );
如果您查看(MSSetimmedia是Microsoft特定的实现)的文档,该功能描述如下:

请求在当前或挂起的任务(如事件或屏幕更新)完成时调用函数

这听起来有点道理,因为它可以确保在调用确保项目可见之前,所有列表视图动画等都已完成


查看此帖子以获取相关帖子:

我可能会为您提供答案。您无法立即设置ListView的滚动位置,因为ListView的布局尚未完成,因此尝试将其滚动到某个位置是徒劳的。因此,您必须等待ListView达到已计算布局的状态。以下是如何

myListView.onloadingstatechanged = function () {
    if (app.sessionState.homeScrollPosition && myListView.loadingState == "viewPortLoaded") {
        myListView.scrollPosition = app.sessionState.homeScrollPosition;
        app.sessionState.homeScrollPosition = null;
    }
};
通过查看我的开放源码中的/pages/home/home.js文件,您可以在上下文中看到这一点。
希望对你有所帮助。

我可能会给你一个答案。您无法立即设置ListView的滚动位置,因为ListView的布局尚未完成,因此尝试将其滚动到某个位置是徒劳的。因此,您必须等待ListView达到已计算布局的状态。以下是如何

myListView.onloadingstatechanged = function () {
    if (app.sessionState.homeScrollPosition && myListView.loadingState == "viewPortLoaded") {
        myListView.scrollPosition = app.sessionState.homeScrollPosition;
        app.sessionState.homeScrollPosition = null;
    }
};
通过查看我的开放源码中的/pages/home/home.js文件,您可以在上下文中看到这一点。
希望这有帮助。

是的,我知道,现在我把这部分代码放在ready函数中,它应该可以与我的ListView配合使用,但事实并非如此,它不会生成任何异常,但我看不到任何滚动条位置变化的滚动。我想知道是否有一些特定的html属性。这是我的列表视图:@Brahim我们可能需要看到更多的代码。我在几个项目中使用EnsureRevible,它的工作原理与上面一样,因此它必须特定于您设置中的某些内容。EnsureRevible适用于我,只要应用程序不处于快照状态。一旦它被折断,EnsureRevible就不再起作用了。仍在寻找解决方案。@Beanwah您是否尝试过将操作推迟一点时间?尝试一些可笑的事情,比如
setTimeout(函数(){listView.ensureRevible(4);},3000)setTimeout(函数(){listView.ensureRevible(4);},3000)并从那里删除超时。yeh认为你可以指定代码的哪一部分或哪一行吗?在/pages/home/home.js中的第61行是我设置滚动位置(自动滚动到某个位置)的地方。在同一文件的第25行,您可以看到我在哪里设置滚动位置。当用户离开该页面时,它会将滚动位置保存在sessionState属性中。yeh认为你可以指定代码的哪一部分或哪一行吗?在/pages/home/home.js中的第61行是我设置滚动位置(自动滚动到某个位置)的地方。在同一文件的第25行,您可以看到我在哪里设置滚动位置。当用户离开该页面时,它会将滚动位置保存在sessionState属性中。