2015-04-24 17 views
6

Buduję aplikację fotograficzną, używając FlipView i listView jako paginacji. Po kliknięciu na miniaturę zdjęcia w ListView pokazuje mi to samo zdjęcie w numerze FlipView. Po przesunięciu do FlipView każde wybrane zdjęcie wybierze ten sam obraz w urządzeniu ListView. Odbywa się to poprzez dodanie do nich obu:Obliczanie przesunięcia poziomego do przewijania ListView do środka zaznaczonego elementu

Do ListView:

SelectedIndex="{Binding Path=SelectedIndex, ElementName=flipView1, Mode=TwoWay} 

i do FlipView:

SelectedIndex="{Binding Path=SelectedIndex, ElementName=listView1, Mode=TwoWay} 

A do zdarzenia ListView SelectionChanged I dodaje:

if (e.AddedItems.Count > 0) 
     listView1.ScrollIntoView(e.AddedItems.First(), ScrollIntoViewAlignment.Leading); 

Jedynym moim problemem jest to, że po przesunięciu FlipView, żądane zdjęcie jest wybrane w ListView, ale ScrollViewer nie jest przewijane do niego. Próbowałem za pomocą WinRTXamlToolkit zmienić pozycję ScrollViewer:

private void pageRoot_Loaded() 
     { 
      // count number of all items 
      int itemCount = this.listView1.Items.Count; 
      if (itemCount == 0) 
       return; 

      if (listView1.SelectedIndex >= itemCount) 
       listView1.SelectedIndex = itemCount - 1; 

      // calculate x-posision of selected item 
      double listWidth = this.listView1.ActualWidth; 
      double xPos = (listWidth/itemCount) * listView1.SelectedIndex; 

      // scroll 
      var scrollViewer2 = listView1.GetFirstDescendantOfType<ScrollViewer>(); 
      if (scrollViewer2 != null) 
       scrollViewer2.ChangeView(xPos, 0.0, 1); 
     } 

Pierwszy raz listWidth jest 1600.0 a następnie staje 0.0 cały czas, co daje xPos = 0.0!

Jak mogę rozwiązać ten problem?

+1

od '' ListViewItem' ma metodę BringIntoView' – Julien

+0

'BringIntoView' nie istnieje w Windows 8.1! "BringIntoViewOnFocusChanged" istnieje dla 'ScrollViewer', ale nie działa zgodnie z oczekiwaniami! – yalematta

+0

Czy przewijasz listę w pionie lub w poziomie? Spróbuję sprawdzić dbl, ale zobaczę, że myślę, że jest na liście1. Czy wszystkie twoje przedmioty mają ten sam rozmiar w widoku listy? – Quincy

Odpowiedz

0
+0

Próbowałem już za pomocą: 'listView1.UpdateLayout(); listView1.ScrollIntoView (listView1.SelectedItem); ' Ale daje mi ten sam błąd: kiedy przerzucam na' FlipView' wiele obrazów (bez patrzenia na 'ListView' po każdym obróceniu), kiedy patrzę na 'ListView' Uważam, że nie przewijał do' SelectedIndex' – yalematta

+0

Użyłem również: 'var zoomLoc = new SemanticZoomLocation() {Item = listView1.SelectedItem}; listView1.MakeVisible (zoomLoc); 'i otrzymuję ten sam błąd ... – yalematta

+0

Brzmi trudno. Z osobistych doświadczeń wynika, że ​​metoda, o której wspomniałem, sprawdziła się w przeszłości.spróbuj zrobić martwą, prostą aplikację, która ma tylko pionowy widok listowy z elementami, a następnie po załadowaniu elementów użyj ScrollIntoView, aby przejść do trzeciego elementu. Jeśli to działa, przynajmniej na dobrej drodze. Następnie powoli dodawaj do niego więcej, jak przewijanie w poziomie i sprawdzaj, czy nadal działa itd. – Quincy

0

ListView.ScrollIntoView() powinien działać. Mogą występować problemy z wywołaniem metody przewijania ScrollViewer, gdy jest już przewijana. Spróbowałbym skrzypić się z ScrollViewer.InvalidateScrollInfo(), co może przyspieszyć. W przeciwnym razie - możesz spróbować obsługiwać zdarzenia ViewChanging/ViewChanged, aby sprawdzić, czy jest przewijany i spróbować użyć tych informacji razem z ScrollViewerViewChangedEventArgs.IsIndeterminate, aby nawiązać połączenie.

sprawdzić także moją odpowiedź na to pytanie: Centering selected item in a scroll viewer

Powiązane problemy