Установка вертикального смещения scrollviewer, когда scrollviewer находится внутри таблицы данных (wp7) - PullRequest
2 голосов
/ 20 января 2011

У меня есть сводка, где каждый сводный элемент содержит просмотрщик. То, что я хочу сделать, это установить смещение прокрутки на определенное число каждый раз, когда я прокручиваю к новому элементу сводки. Я не могу создать привязку данных, потому что значение смещения не отображается.

Существует функция ScrollToVerticalOffset (), которую я могу вызвать, но сначала мне нужно выяснить, какой scrollviewer в данный момент активен, и получить этот объект, что означает scrollviewer внутри текущего выбранного элемента сводки.

Я пытался получить просмотрщик прокрутки, обходя визуальное дерево по его имени, но всегда получал 1-й просмотрщик прокрутки.

Как я мог это сделать?

1009 * спасибо *

1 Ответ

3 голосов
/ 20 января 2011

Вы можете пройтись по визуальному дереву по типу, а не по имени и начать с выбранного 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);
...