Получение доступа к 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 не будет инициирован. В общем, чтобы вы не гадали, в чём проблема, при различных ситуациях 😉 Вы же, подберите более удачный вариант, подходящий под вашу ситуацию.