2011-01-20 74 views
2

我有一個數據透視表,其中每個數據透視圖包含一個滾動查看器。 我想要做的是每次滾動到一個新的數據透視表項時,將scrollviewer的偏移量設置爲一個特定的數字。我無法創建數據綁定,因爲偏移值沒有公開。當滾動查看器位於數據模板內時設置滾動查看器垂直偏移(wp7)

有一個我可以調用的ScrollToVerticalOffset(),但我需要先找到哪個scrollviewer當前處於活動狀態並獲取該對象,這意味着當前選定的透視項目中的scrollviewer。

我試圖通過遍歷基於它的名稱的可視化樹來獲得scrollviewer,但我總是得到第一個scrollviewer。

我該怎麼做?

感謝名單

回答

3

你可以按類型而不是按名稱遍歷可視化樹,並在選定的PivotItem,這應該意味着你找到的第一個ScrollViewer中會是你想要的一個開始。

 /// <summary> 
     /// Gets the visual children of type T. 
     /// </summary> 
     /// <typeparam name="T"></typeparam> 
     /// <param name="target"></param> 
     /// <returns></returns> 
     public static IEnumerable<T> GetVisualChildren<T>(this DependencyObject target) 
      where T : DependencyObject 
     { 
      return GetVisualChildren(target).Where(child => child is T).Cast<T>(); 
     } 


     /// <summary> 
     /// Get the visual tree children of an element. 
     /// </summary> 
     /// <param name="element">The element.</param> 
     /// <returns>The visual tree children of an element.</returns> 
     /// <exception cref="T:System.ArgumentNullException"> 
     /// <paramref name="element"/> is null. 
     /// </exception> 
     public static IEnumerable<DependencyObject> GetVisualChildren(this DependencyObject element) 
     { 
      if (element == null) 
      { 
       throw new ArgumentNullException("element"); 
      } 

      return GetVisualChildrenAndSelfIterator(element).Skip(1); 
     } 

     /// <summary> 
     /// Get the visual tree children of an element and the element itself. 
     /// </summary> 
     /// <param name="element">The element.</param> 
     /// <returns> 
     /// The visual tree children of an element and the element itself. 
     /// </returns> 
     private static IEnumerable<DependencyObject> GetVisualChildrenAndSelfIterator(this DependencyObject element) 
     { 
      Debug.Assert(element != null, "element should not be null!"); 

      yield return element; 

      int count = VisualTreeHelper.GetChildrenCount(element); 
      for (int i = 0; i < count; i++) 
      { 
       yield return VisualTreeHelper.GetChild(element, i); 
      } 
     }

所以你最終的東西是這樣的:

var scroller = ((PivotItem)pivot.SelectedItem).GetVisualChildren().FirstOrDefault(); 
scroller.ScrollToVerticalOffset(offset);
+0

感謝名單德里克,它幫助 – johnX99 2011-01-21 15:46:26