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

时间:2013-03-18 15:32:34

标签: javascript listview microsoft-metro windows-store-apps winjs

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

listView.ensureVisible(itemIndex); 

但它不起作用。另一种选择:

yourListView.currentItem = { index: 8, hasFocus: true, showFocus: true }

它也失败了。

如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

通常,您必须在调用msSetImmediate时将调用包装到ensureVisible(index)。不确定为什么会这样,可能是一个错误,但对我有用。例如:

msSetImmediate(function (){ listView.ensureVisible(4);} );

如果查看setImmediate的文档(msSetImmediate是Microsoft特定的实现),该函数描述为:

  

请求在当前或待处理任务完成时调用函数,例如事件或屏幕更新。

这确实有点意义,因为它听起来确保在拨打电话之前完成所有列表视图动画等,以确保项目可见。

请参阅此主题以获取相关帖子:http://social.msdn.microsoft.com/Forums/en-US/winappswithhtml5/thread/2f11e46f-9421-4e31-93d3-fca06563ec41/

答案 1 :(得分:0)

我可能会给你答案。您无法立即设置ListView的滚动位置,因为ListView的布局尚未完成,因此尝试将其滚动到某个位置是徒劳的。因此,您必须等到ListView进入其计算布局的状态。这是怎么......

myListView.onloadingstatechanged = function () {
    if (app.sessionState.homeScrollPosition && myListView.loadingState == "viewPortLoaded") {
        myListView.scrollPosition = app.sessionState.homeScrollPosition;
        app.sessionState.homeScrollPosition = null;
    }
};

通过查看我的开源codeSHOW project中的/pages/home/home.js文件,您可以在上下文中看到这一点。 希望有所帮助。