2014-10-11 5 views
1

Итак, наконец, я получаю ViewportControl, от которого так долго искал LongListSelector, но когда я пытаюсь прокрутите до определенного значения смещения, используя приведенные ниже методы, я не могу прокрутить до смещения. Я использую открытый статический класс GlobalVars (глобальные переменные) для передачи данных между страницами.Прокрутка LongListSelector по вертикальному смещению путем получения его Viewport - не может добавить динамическое значение в SetViewportOrigin()

Таким образом, когда пользователь выбирает item из LongListSelector -> Переходит к ItemDetail Страница этим:

private void llsArtists_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     GetFirstVisibleItem(llsArtists); 
     var artist = (Artist)e.AddedItems[0]; 
     GlobalVars._artistName = artist.ArtistName; 
     GetSelectedArtist(artist.ArtistName); 

     NavigationService.Navigate(new Uri("/ArtistDetail.xaml", UriKind.Relative)); 
    } 

, а затем возвращается к той же странице, нажав Back ключ, я хотел бы, чтобы пользователь на той же позиции, что и последний (на данный момент он переходит к первому индексу). Таким образом, я получаю Viewport и вертикальное смещение:

 private void GetFirstVisibleItem(LongListSelector lls) 
    {  
     var offset = FindViewport(lls).Viewport.Top; 
     GlobalVars._artistScrollOffset = offset; 
    } 


    private static ViewportControl FindViewport(DependencyObject parent) 
    { 
     var childCount = VisualTreeHelper.GetChildrenCount(parent); 
     for (var i = 0; i < childCount; i++) 
     { 
      var elt = VisualTreeHelper.GetChild(parent, i); 
      if (elt is ViewportControl) 

       return (ViewportControl)elt; 

      var result = FindViewport(elt); 

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

и, наконец, ScrollToOffset

 void ScrollToOffset() 
    { 
     Point loc = new Point(); 
     loc.X = 0; 
     //loc.Y = Math.Round(GlobalVars._artistScrollOffset, 2); 
     loc.Y = GlobalVars._artistScrollOffset; 
     FindViewport(llsArtists).SetViewportOrigin(loc); 
    } 

Проблема: если я явно задал значение Y для Point loc, как я установил loc.X = 0, он просто отлично работает! LongListSelector отлично работает! Но, если бы я хотел, чтобы это была переменная, которая именно то, что мне бы хотелось, - ЭТО ПРОСТО НЕ РАБОТАЕТ! Я нахожу это очень странным? Что может быть причиной этого? Любая помощь будет оценена!

ответ

0

Я думаю, вы уже слишком много думали об этом. Вам не нужно ничего делать, он должен вернуться к странице, где она остановилась в точном положении.

Единственное, что я могу думать, что вы «изменение»/«сброс»DataContext или ItemsSource когда вы NavigateTo или NavigateFrom. Другая возможность заключается в том, что вы устанавливаете LongListSelector DataContent/ItemsSource на событие PhoneApplicationPage_Loaded.

Если вы сделали последний, он сбросит список.

Либо установить ItemsSource в конструкторе или изменить PhoneApplicationPage_Loaded на что-то вроде этого:

private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) 
{ 
    if(myLongListSelector.ItemsSource == null) 
    { 
     // myLongListSelector.ItemsSource = YOUR_DATASOURCE; 
    }   
} 

Таким образом, это будет только установить его один раз, чтобы вернуться к странице не переназначить его.

+0

Hi. Я действительно очищаю ItemsSource, а затем снова извлекаю элементы, поскольку в противном случае пользователь переходит на одну страницу, возвращаясь назад. Он добавляет дубликаты в коллекцию. : S –

+0

@NavikGoswami Просто извлекайте элементы один раз, если ItemSource имеет значение null или делает это в конструкторе страницы. Нет необходимости очищать, если элементы одинаковые. –