当scrollviewer位于datatemplate(wp7)内时,设置scrollviewer垂直偏移量

时间:2011-01-20 12:22:36

标签: windows-phone-7 datatemplate scrollviewer

我有一个pivot,其中每个pivotItem包含一个scrollviewer。 我想要做的是每次滚动到新的枢轴项目时将scrollviewer的偏移量设置为特定的数字。我无法创建数据绑定,因为偏移值未公开。

我可以调用ScrollToVerticalOffset(),但我需要先找到当前处于活动状态的scrollviewer并获取该对象,这意味着当前所选枢轴项内的scrollviewer。

我尝试通过基于名称遍历可视树来获取scrollviewer,但我总是得到第一个scrollviewer。

我怎么能这样做?

感谢名单

1 个答案:

答案 0 :(得分: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);