windows-phone-7 – 在tombstone之后恢复LongListSelector中的滚
我正在尝试使用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; 然后,当用户返回页面时,我检查两个值之一(状态或变量)并使用它来恢复最后一个滚动位置. if (_lastItem == null) { if (state.ContainsKey("IndexByName_LastTopItem")) { _lastItem = state["IndexByName_LastTopItem"] as Chemical; } } if (_lastItem != null) Dispatcher.BeginInvoke(() => { myLongList.ScrollTo(_lastItem); }); 除非应用程序墓碑,否则这很有用.在这种情况下,我没有收到任何错误,但列表完全空白,直到我触摸并拖动.一旦我这样做,它会重新显示在列表的顶部.我看了一下控件的来源,发现当你调用.ScrollTo(对象)时,它没有得到匹配.进一步调查发现,在搜索要滚动的项目时,使用==而不是等于进行比较.我只覆盖了Equals,显然默认==比较(按设计)引用.在逻辑删除后恢复状态项时,引用不匹配. 解决方法
这是我最终提出的解决方案……
由于源代码可以免费用于Toolkit,我最终编辑了LongListSelector源代码来调用.Equals而不是==.它似乎适用于我的用例,我想我会分享以防其他任何人发现它有用… 在LongListSelector.cs中找到GetFlattenedIndex(对象项)函数并替换 if (item == _flattenedItems[index].Item) 同 if (item.Equals(_flattenedItems[index].Item)) 然后在同一个文件中找到GetResolvedIndex(对象项,out ContentPresenter contentPresenter)函数并替换 if (node.Value.Content == item) // Nov 2010 Release // OR if (_flattenedItems[index].Item == item) // Feb 2011 Release 同 if (item.Equals(node.Value.Content)) // Nov 2010 Release // OR if (item.Equals(_flattenedItems[index].Item)) // Feb 2011 Release 请注意,替换取决于您正在使用的工具包下载! 一旦对控件进行了这些更改,它就会正确匹配ScrollTo(对象)中指定的对象,即使引用不相等,只要您正确覆盖LongListSelector中显示的所有对象类型的Equals即可.如果您有分组列表,请不要忘记这适用于您的分组类以及您的项目类! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |