2015-04-24 28 views
6

Sto costruendo un'applicazione fotografica, utilizzando un FlipView e un listView come impaginazione. Quando faccio clic sull'immagine in miniatura nello ListView, viene visualizzata la stessa immagine nello FlipView. E quando faccio scorrere lo FlipView, qualsiasi foto selezionata selezionerà la stessa immagine nel ListView. Questo viene fatto aggiungendo ad entrambi:Calcolare l'offset orizzontale per scorrere ListView al centro dell'oggetto Selected

Al ListView:

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

E alla FlipView:

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

E per l'evento ListView SelectionChanged ho aggiunto:

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

Il mio unico problema è che quando faccio scorrere lo FlipView, l'immagine desiderata viene selezionata nello ListView ma lo ScrollViewer non viene spostato su di esso. Ho provato ad utilizzare WinRTXamlToolkit per cambiare la posizione del 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); 
     } 

La prima volta listWidth è 1600.0 e poi diventa 0.0 tutto il tempo, che dà xPos = 0.0!

Come posso risolvere questo?

+1

un 'ListViewItem' ha un' metodo BringIntoView' – Julien

+0

'BringIntoView' non esiste in Windows 8.1! 'BringIntoViewOnFocusChanged' esiste per' ScrollViewer' ma non funziona come previsto! – yalematta

+0

La lista è a scorrimento verticale o orizzontale? Proverò a controllare dbl ma a visualizzare ho pensato che è su listview1. Tutti i tuoi articoli hanno le stesse dimensioni nella lista? – Quincy

risposta

0

https://msdn.microsoft.com/library/windows/apps/windows.ui.xaml.controls.listview.aspx

Si consiglia di utilizzare uno dei due metodi "ScrollIntoView".

+0

Ho provato a usare: 'listView1.UpdateLayout(); listView1.ScrollIntoView (listView1.SelectedItem); ' Ma mi dà lo stesso bug: quando sfoglio le immagini di' FlipView' (senza guardare il 'ListView' dopo ogni flip), quando guardo il 'ListView' Trovo che non sia scorretto fino a' SelectedIndex' – yalematta

+0

Ho anche usato: 'var zoomLoc = new SemanticZoomLocation() {Item = listView1.SelectedItem}; listView1.MakeVisible (zoomLoc); 'e sto ottenendo lo stesso bug ... – yalematta

+0

Suoni difficili. Per esperienza personale, il metodo che ho menzionato ha funzionato per me in passato.prova a creare un'app semplice e definitiva che abbia solo un elenco verticale di oggetti e poi, una volta caricati gli oggetti, scorri su ScrollIntoView per andare al terzo elemento. Se questo funziona almeno su una buona strada. Poi aggiungici di più lentamente come lo scorrimento orizzontale e vedi se funziona ancora ecc. – Quincy

0

ListView.ScrollIntoView() dovrebbe funzionare. Potrebbero esserci problemi con la chiamata di un metodo per scorrere uno ScrollViewer mentre sta già scorrendo. Vorrei provare a giocherellare con ScrollViewer.InvalidateScrollInfo() che potrebbe accelerarlo. Altrimenti, potresti provare a gestire gli eventi ViewChanging/ViewChanged per vedere se sta scorrendo e provare a utilizzare tali informazioni insieme a ScrollViewerViewChangedEventArgs.IsIndeterminate per concatenare le chiamate.

Controllare anche la mia risposta a questa domanda: Centering selected item in a scroll viewer