Как вы можете синхронизировать положение нескольких PanoramaItems? - PullRequest
1 голос
/ 21 марта 2012

У меня есть стандартное приложение Panorama, но один ключевой элемент данных повторяется в двух смежных PanoramaItems.

Мне бы хотелось, чтобы эти два PanoramaItems имели одинаковую вертикальную позицию прокрутки (чтобы избавить пользователя от необходимости снова находить ключевой элемент).

Есть ли способ получить и установить положение прокрутки элемента управления PanoramaItem и обнаружить изменение прокрутки?

Общее решение (спасибо Полу Дистону за подсказки):

    /// <summary>
    /// Scroll each new PanoramaItem to the same position as the previous one
    /// </summary>
    private void Panorama_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (e.RemovedItems.Count > 0 && e.AddedItems.Count > 0)
        {
            // Add logic here if only specific PanoramaItems are required to sync

            ScrollViewer firstChildAsScrollViewer =
                GetChildOfType(e.RemovedItems[0] as DependencyObject, typeof (ScrollViewer)) as ScrollViewer;
            ScrollViewer secondChildAsScrollViewer =
                GetChildOfType(e.AddedItems[0] as DependencyObject, typeof (ScrollViewer)) as ScrollViewer;
            if ((firstChildAsScrollViewer != null) && (secondChildAsScrollViewer != null))
            {
                secondChildAsScrollViewer.ScrollToVerticalOffset(firstChildAsScrollViewer.VerticalOffset);
            }
        }
    }

    /// <summary>
    /// Bredth-first recursive check for a child of the specified type
    /// </summary>
    private DependencyObject GetChildOfType(DependencyObject element, Type type)
    {
        int count = VisualTreeHelper.GetChildrenCount(element);
        for (int i = 0; i < count; i++)
        {
            var e = VisualTreeHelper.GetChild(element, i);
            if (e.GetType() == type)
            {
                return e;
            }
        }
        // Now try the grandchildren
        for (int i = 0; i < count; i++)
        {
            var e = VisualTreeHelper.GetChild(element, i);
            var ret = GetChildOfType(e, type);
            if (ret != null)
            {
                return ret;
            }
        }
        return null;
    }

1 Ответ

2 голосов
/ 21 марта 2012

Вы можете использовать VisualTreeHelper для доступа и установки VerticalOffset ScrollViewer элементов управления ListBox: -

    private void Panorama_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        DependencyObject firstChild = VisualTreeHelper.GetChild(this.FirstListBox, 0);

        ScrollViewer firstChildAsScrollViewer = firstChild as ScrollViewer;

        DependencyObject secondChild = VisualTreeHelper.GetChild(this.SecondListBox, 0);

        ScrollViewer secondChildAsScrollViewer = secondChild as ScrollViewer;

        if ((firstChildAsScrollViewer != null) && (secondChildAsScrollViewer != null))
        {
            secondChildAsScrollViewer.ScrollToVerticalOffset(firstChildAsScrollViewer.VerticalOffset);
        }
    }

Надеюсь, это поможет.

Пол Дистон

...