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