2012-07-04 78 views
11

我如何使Windows 8 ListView內的ListItems水平流動。默認行爲是垂直的,但我想在水平流中顯示列表,以便它可以呈現爲全景圖。Windows 8的ListView與水平項目流

我嘗試了支持水平佈局的GridView,但是項目高度有一個限制,它沒有顯示大文本項目的完整項目內容。

+0

即使它是關於WPF的答案,這對我在我的WinRT應用程序中工作:http://stackoverflow.com/questions/359217/how-do-i-make-wpf-listview-items-repeat-horizo​​ntally- like-a-horizo​​ntal-scrollba – KallDrexx

回答

47

您可以使用一個ListView這樣:

<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> 

- 這給它一個水平面板和水平滾動條右側滾動條。

ListView和GridView都會在您獲取較大的項目時導致問題。我認爲默認情況下,這些項目可能會根據添加的第一個項目的大小來確定大小。您可以手動設置該尺寸:

<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> 

- 請注意,所有項目的尺寸必須相同。

- 也注意到 - 我已經改變了這個答案,以取代與ItemsStackPanel這是虛擬化的一個StackPanel,所以它應該讓你的大數據集更好的性能和更低的內存使用率,但 - 不創建具有大型水平滾動列表的佈局。在一些非常有限的情況下,它們可能是一個很好的解決方案,但在大多數情況下,它們會打破許多良好的UI模式,並使您的應用程序難以使用。

+1

這種方法似乎也解決了觸摸鍵盤出現在GridView的編輯控件上的問題!我無法滿足這個答案! –

+0

請注意,使用'StackPanel'作爲'ItemsPanel'禁用了虛擬化,因此您不應該將它與未受控制的大小列表一起使用。我會嘗試使用'ItemsStackPanel'來代替這種情況。我沒有更新答案,雖然我沒有測試過。很確定它應該工作。在8.1中有 –

+0

有一種叫做「VirtualizingStackPanel」的東西 – Quincy

5

您也可以使用樣式封裝Filips方法:

<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> 

它應用到你的列表視圖需要:

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

我寧願風格的做法,但你必須仔細修改面板方向。在第一個視覺佈局通過之前,物品控制面板將不會被創建,因此將無法修改。如果它不同於Xaml的一行,你必須找到一個處理設置初始方向的策略。也可以通過樣式設置器分配ItemsPanelTemplate。