1

我有一个标准的基于全景的应用程序,但一个关键数据项在两个相邻的PanoramaItems.

我希望这两个PanoramaItems具有相同的垂直滚动位置(以节省用户必须再次找到关键项目)。

有没有办法获取和设置PanoramaItem控件的滚动位置并检测滚动变化?

通用解决方案(感谢 Paul Diston 提供的线索):

    /// <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;
    }
4

1 回答 1

2

您可以使用 VisualTreeHelper 访问和设置 ListBox 控件的 ScrollViewer 的 VerticalOffset:-

    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);
        }
    }

希望这可以帮助。

保罗·迪斯顿

于 2012-03-21T13:09:43.420 回答