我正在尝试使用 WP7 Silverlight Toolkit 中的 LongListSelector 控件。这需要一些工作,但我终于让它与我的应用程序一起使用。不幸的是,我在正确处理墓碑过程时遇到了一些麻烦。
当应用程序墓碑(或用户通过选择列表中的项目导航到另一个页面)时,我保存列表中最顶部可见项目的副本。我将它保存到类变量和应用程序状态集合中。
ICollection<object> visibleItems = myLongList.GetItemsInView();
_lastItem = null;
if (visibleItems.Count > 0)
_lastItem = visibleItems.First();
IDictionary<string, object> state =
Microsoft.Phone.Shell.PhoneApplicationService.Current.State;
state["IndexByName_LastTopItem"] = _lastItem;
然后,当用户返回页面时,我检查两个值(状态或变量)之一并使用它来恢复最后滚动位置。
if (_lastItem == null)
{
if (state.ContainsKey("IndexByName_LastTopItem"))
{
_lastItem = state["IndexByName_LastTopItem"] as Chemical;
}
}
if (_lastItem != null)
Dispatcher.BeginInvoke(() => { myLongList.ScrollTo(_lastItem); });
除非应用程序墓碑,否则这很有效。在这种情况下,我没有收到任何错误,但列表完全是空白的,直到我触摸它并拖动它。一旦我这样做了,它就会重新显示在列表的顶部。我查看了控件的来源,发现当您调用 .ScrollTo(object) 时,它没有匹配。进一步调查发现,在搜索要滚动到的项目时,它使用 == 而不是 Equals 进行比较。我只覆盖了 Equals,显然默认 == 比较(按设计)引用。当您在墓碑化后恢复状态项时,引用不匹配。我可以覆盖 ==,但这感觉不对。我可以更改并重建控制源以调用 equals (我尝试过并且有效),但它是由比我聪明得多的人编写的,我想知道我是否不明白。