2015-04-24 17 views
6

Ich baue eine Fotoapplikation mit einer FlipView und einer listView als Paginierung. Wenn ich auf das Vorschaubild in der ListView klicke, zeigt es mir das gleiche Bild in der FlipView. Und wenn ich in die FlipView wische, wählt jedes ausgewählte Foto das gleiche Bild in der ListView aus. Dies geschieht, indem sie beide und fügen hinzu:Berechnen Sie den horizontalen Versatz, um ListView zur Mitte des SelectedItems zu scrollen

Um die ListView:

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

Und die FlipView:

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

Und die ListView SelectionChanged Veranstaltung, die ich hinzugefügt:

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

Mein einziges Problem ist, dass wenn ich diewischewird das gewünschte Bild in der ListView ausgewählt, aber die ScrollViewer wird nicht zu ihm gescrollt. Ich habe versucht, mit WinRTXamlToolkit die Position der ScrollViewer zu ändern:

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); 
     } 

Das erste Mal listWidth ist 1600.0 und dann wird es 0.0 die ganze Zeit, die xPos = 0.0 gibt!

Wie kann ich das beheben?

+1

ein 'ListViewItem' hat eine' BringIntoView' Methode – Julien

+0

'BringIntoView' existiert nicht in Windows 8.1! 'BringIntoViewOnFocusChanged' existiert für den' ScrollViewer', aber es funktioniert nicht wie erwartet! – yalematta

+0

Ist Ihre Liste vertikal oder horizontal gescrollt? Ich werde versuchen, dbl überprüfen, aber in Sicht bringen, die ich dachte, ist auf der listview1. Sind alle Ihre Artikel in der Listenansicht gleich groß? – Quincy

Antwort

0
+0

Ich habe versucht mit: 'listView1.UpdateLayout(); listView1.ScrollIntoView (listView1.SelectedItem); ' Aber es gibt mir den gleichen Fehler: wenn ich FlipView' viele Bilder (ohne Blick auf die 'ListView' nach jedem Flip), wenn ich auf die 'ListView' Ich finde, dass es nicht zum' SelectedIndex' gescrollt hat. – yalematta

+0

Ich habe auch benutzt: 'var zoomLoc = new SemanticZoomLocation() {Item = listView1.SelectedItem}; listView1.MakeVisible (zoomLoc); 'und ich bekomme den gleichen Fehler ... – yalematta

+0

Klingt schwierig. Aus persönlicher Erfahrung hat die Methode, die ich erwähnt habe, in der Vergangenheit für mich funktioniert.Versuchen Sie, eine tote einfache App zu erstellen, die nur eine vertikale Listenansicht mit Elementen enthält und dann nach dem Laden von Elementen ScrollIntoView verwendet, um zum dritten Element zu gelangen. Wenn das klappt, dann zumindest auf einem guten Weg. Dann fügen Sie langsam mehr hinzu, wie horizontales Scrollen und sehen, ob es noch funktioniert etc. – Quincy

0

ListView.ScrollIntoView() sollte funktionieren. Möglicherweise gibt es Probleme beim Aufrufen einer Methode zum Scrollen eines ScrollViewer, während es bereits scrollt. Ich würde versuchen, mit ScrollViewer.InvalidateScrollInfo() fummeln, die es beschleunigen könnte. Andernfalls - Sie könnten versuchen, die ViewChanging/ViewChanged Ereignisse zu bearbeiten, um zu sehen, ob es scrollen und versuchen Sie, diese Informationen zusammen mit ScrollViewerViewChangedEventArgs.IsIndeterminate zu verwenden, um die Anrufe zu verketten.

Überprüfen Sie auch meine Antwort auf diese Frage: Centering selected item in a scroll viewer