2010-12-17 12 views
8

私は、アプリをtombstonedからうまく戻すように取り組んでいます。アプリには大きなリストボックスが含まれているので、リストボックスの周りをスクロールしている間はどこにでもスクロールするのが理想的です。Windows Phone 7のリストボックスの正確なスクロール位置を復元する

特定のSelectedItemにジャンプするのは簡単です。残念なことに私のアプリでは実際にアイテムを選択する必要はなく、スクロールするだけです。私が本当に欲しいのは、MyListbox.ScrollPositionYのようなものですが、存在しないようです。

アイデア?

クリス

答えて

10

あなたはVerticalOffsetプロパティの値を取得し、その後SetVerticalOffsetメソッドを呼び出すことができるように内部的にListBoxで使用されているScrollViewerのホールドを取得する必要があります。

これは、ListBoxから内部構造を構成するビジュアルツリーを介して到達する必要があります。

は、私は(私はブログ上でこれを置く、私はそれを繰り返し続けるちゃたので)あなたのプロジェクトに追加する必要があり、この便利な拡張クラスを使用します -

public static class VisualTreeEnumeration 
{ 
    public static IEnumerable<DependencyObject> Descendents(this DependencyObject root, int depth) 
    { 
     int count = VisualTreeHelper.GetChildrenCount(root); 
     for (int i = 0; i < count; i++) 
     { 
      var child = VisualTreeHelper.GetChild(root, i); 
      yield return child; 
      if (depth > 0) 
      { 
       foreach (var descendent in Descendents(child, --depth)) 
        yield return descendent; 
      } 
     } 
    } 

    public static IEnumerable<DependencyObject> Descendents(this DependencyObject root) 
    { 
     return Descendents(root, Int32.MaxValue); 
    } 

    public static IEnumerable<DependencyObject> Ancestors(this DependencyObject root) 
    { 
     DependencyObject current = VisualTreeHelper.GetParent(root); 
     while (current != null) 
     { 
      yield return current; 
      current = VisualTreeHelper.GetParent(current); 
     } 
    } 
} 

この利用可能でListBox(とその他のすべてのUIElements)は、いくつかの新しい拡張メソッドDescendentsAncestorsを取得します。私たちはそれらをLinqと組み合わせてものを探すことができます。この場合、次を使用できます。 -

ScrollViewer sv = SomeListBox.Descendents().OfType<ScrollViewer>().FirstOrDefault(); 
+0

ありがとうございました!私はコントロールのメーキャップがこのようにナビゲートできることに気づいていませんでした。 –

+0

その情報をいつどのように使用するのか分かりますか?どのようにしてページは、それが束縛の束を飛び越えずに墓石から復元されていることを知っていますか? – Roger

+0

@Roger:このMSDNのトピックを読んでください:http://msdn.microsoft.com/en-us/library/ff967548(v=VS.92).aspx – AnthonyWJones

関連する問題