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;
次に、ユーザーがページに戻ったときに、2 つの値 (状態または変数) のいずれかを確認し、それを使用して最後のスクロール位置を復元します。
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 を上書きしただけで、明らかにデフォルトの == は (設計上) 参照を比較します。廃棄後に State アイテムを復元すると、参照が一致しません。== を上書きすることはできますが、それは間違っているように感じます。代わりに equals を呼び出すようにコントロール ソースを変更して再構築することはできますが (試してみたところ、うまくいきました)、それは私よりもずっと賢い人によって書かれたものであり、私はそれを理解できないのではないかと思っています。