2012-07-04 13 views
11

Come posso fare in modo che i ListItem all'interno di Windows 8 ListView scorrano orizzontalmente. Il comportamento predefinito è verticale, ma voglio mostrare l'elenco nel flusso orizzontale in modo che possa eseguire il rendering come panorama.Windows 8 ListView con flusso di articoli orizzontale

Ho provato GridView che supporta il layout orizzontale ma esiste una limitazione dell'altezza degli articoli che non mostra il contenuto completo dell'articolo per gli articoli con testo grande.

+0

Anche se è una risposta a WPF, questo ha funzionato per me nella mia app WinRT: http://stackoverflow.com/questions/359217/how-do-i-make-wpf-listview-items-repeat-horizontally- like-a-horizontal-scrollba – KallDrexx

risposta

47

È possibile utilizzare un controllo ListView in questo modo:

<ListView 
    Height="500" 
    VerticalAlignment="Center" 
    ScrollViewer.HorizontalScrollBarVisibility="Auto" 
    ScrollViewer.VerticalScrollBarVisibility="Disabled" 
    ScrollViewer.HorizontalScrollMode="Enabled" 
    ScrollViewer.VerticalScrollMode="Disabled" 
    ScrollViewer.ZoomMode="Disabled" 
    SelectionMode="None"> 
    <ListView.ItemsPanel> 
     <ItemsPanelTemplate> 
      <ItemsStackPanel 
       Orientation="Horizontal" /> 
     </ItemsPanelTemplate> 
    </ListView.ItemsPanel> 

- che gli conferisce un pannello orizzontale e le barre di scorrimento a destra per lo scorrimento orizzontale.

Sia ListView che GridView possono causare problemi quando si ottengono oggetti più grandi. Penso che, per impostazione predefinita, gli elementi possano essere ridimensionati in base alle dimensioni del primo elemento aggiunto. È tuttavia possibile impostare tale dimensione manualmente:

<ListView.ItemContainerStyle> 
    <Style 
     TargetType="ListViewItem"><!-- note - for GridView you should specify GridViewItem, for ListBox - ListBoxItem, etc. --> 
     <Setter 
      Property="Height" 
      Value="200" /> <!-- this is where you can specify the size of your ListView items --> 
     <Setter 
      Property="Width" 
      Value="350" /> 
    </Style> 
</ListView.ItemContainerStyle> 

- tutti gli articoli devono avere le stesse dimensioni.

- anche notare - ho cambiato questa risposta per sostituire un StackPanel con una ItemsStackPanel che è virtualizzato, quindi dovrebbe ottenere migliori prestazioni e utilizzo della memoria inferiore per grandi insiemi di dati, ma FAVORE - non creare layout con grandi elenchi scorrevoli orizzontalmente. Potrebbero essere una buona soluzione in alcuni scenari molto limitati, ma nella maggior parte dei casi interromperanno molti buoni schemi dell'interfaccia utente e renderanno l'applicazione più difficile da utilizzare.

+1

Questo approccio sembra anche risolvere il problema con la tastiera touch che appare sui controlli di modifica in GridView! Non posso revocare abbastanza questa risposta! –

+0

Si noti che l'uso di 'StackPanel' come' ItemsPanel' disabilita la virtualizzazione, quindi non si dovrebbe usare con elenchi di dimensioni incontrollate. Proverei ad usare 'ItemsStackPanel' invece in questi casi. Non sto aggiornando la risposta anche se non l'ho ancora testata. Abbastanza sicuro che dovrebbe funzionare comunque. –

+0

in 8.1 c'è qualcosa chiamato "VirtualizingStackPanel" – Quincy

5

È inoltre possibile incapsulare approccio Filips utilizzando uno stile:

<Style TargetType="ListView" x:Key="VerticalListView"> 
     <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto" /> 
     <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Disabled" /> 

     <Setter Property="ScrollViewer.HorizontalScrollMode" Value="Enabled" /> 
     <Setter Property="ScrollViewer.VerticalScrollMode" Value="Disabled" /> 

     <Setter Property="ScrollViewer.ZoomMode" Value="Disabled" /> 
     <Setter Property="SelectionMode" Value="None" /> 

     <Setter Property="ItemsPanel"> 
      <Setter.Value> 
       <ItemsPanelTemplate> 
        <StackPanel VerticalAlignment="Top" Orientation="Horizontal" /> 
       </ItemsPanelTemplate> 
      </Setter.Value> 
     </Setter> 

     <Setter Property="ItemContainerStyle"> 
      <Setter.Value> 
       <Style TargetType="ListViewItem"> 
        <Setter Property="Height" Value="400" /> 
       </Style> 
      </Setter.Value> 
     </Setter> 
    </Style> 

applicare al vostro ListViews in base alle esigenze:

<ListView Style="{StaticResource VerticalListView}" /> 
0

io preferirei l'approccio stili, ma avrete bisogno di essere attenta modifica dell'orientamento del pannello. Prima che il primo layout visivo passi le voci, il pannello di controllo non verrà creato e quindi non sarà disponibile per la modifica. Dovresti trovare una strategia per gestire l'impostazione dell'orientamento iniziale se è diversa da quella del tuo Xaml. Magari assegna anche ItemsPanelTemplate tramite un setter di stile.

Problemi correlati