[ WP7 ] Get Access to ScrollViewer in ListBox

Получение доступа к ScrollViewer в ListBox

Бывает, что требуется менять положение прокрутки в ListBox через ScrollToVerticalOffset, к примеру в файловом менеджере, при возвращении назад, но почему-то эта возможность не предусмотрена в ListBox под WP. В интернете предлагают следующее решение:

<ScrollViewer x:Name="LScrollViewer" HorizontalScrollBarVisibility="Disabled">
   <ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Disabled" x:Name="List"  HorizontalAlignment="Stretch" Tap="ContentList_Tap" HorizontalContentAlignment="Stretch">
      <ListBox.ItemTemplate>
<!-- ... --!>

      </ListBox.ItemTemplate>
   </ListBox>
</ScrollViewer>

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

Как стоит сделать, оставить xaml в покое.

private ScrollViewer LScrollViewer;

//... Добавим событие полной инициализации ListBox и выдернем наш ScrollViewer
        private void List_Loaded(object sender, RoutedEventArgs e)
        {
            if (LScrollViewer == null)
                LLScrollViewer = FindVisualChild<ScrollViewer>(LocalList);
        }

        public static childItem FindVisualChild<childItem>(DependencyObject obj) where childItem : DependencyObject
        {
            // Search immediate children first (breadth-first)
            for (int i = 0; i < System.Windows.Media.VisualTreeHelper.GetChildrenCount(obj); i++)
            {
                DependencyObject child = System.Windows.Media.VisualTreeHelper.GetChild(obj, i);

                if (child != null && child is childItem)
                    return (childItem)child;

                else
                {
                    childItem childOfChild = FindVisualChild<childItem>(child);

                    if (childOfChild != null)
                        return childOfChild;
                }
            }

            return null;
        }

Таким образом, у нас есть LScrollViewer, которым мы можем пользоваться так, как привыкли. Почему именно в событии List_Loaded ? Ведь оно может происходить, несколько раз. Во-первых, если ListBox находится на Pivot element , скажем, со вторым номером, то при запуске приложения LScrollViewer не будет инициирован. В общем, чтобы вы не гадали, в чём проблема, при различных ситуациях 😉 Вы же, подберите более удачный вариант, подходящий под вашу ситуацию.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *