2010-09-08 52 views
2

我有大量的數據(超過200項)的一個ListView這樣節省空間它是利用一個UniformGrid的顯示3列,而不是1最佳WPF多列列表視圖方法

<ListView.ItemsPanel> 
    <ItemsPanelTemplate> 
     <UniformGrid Columns="3" /> 
    </ItemsPanelTemplate> 
</ListView.ItemsPanel> 

我還修改樣式,使每個項目都對準頂端

<ListView.Resources> 
    <Style TargetType="{x:Type ListView}"> 
     <Setter Property="ItemContainerStyle"> 
      <Setter.Value> 
       <Style TargetType="ListViewItem"> 
        <Setter Property="VerticalContentAlignment" Value="Top"/> 
       </Style> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ListView.Resources> 

然而,這工程確定,由於顯示的數據長度的差異,仍然有項目組浪費的空間,因爲大多數的數據適合在一條線上,但偶爾會有一個項目佔用2行或更多行。這意味着,一個組中的所有行佔2個或更多行時它只有1,需要額外的空間

alt text

有誰知道如何解決這個問題,或者可以建議其他方法來避免uniformgrid行?謝謝!

回答

5

您可以使用垂直WrapPanel並禁用垂直滾動。這會導致項目出現在右側添加了附加列的列中,類似於Windows資源管理器中的列表視圖。如果您不希望單行的長文本擴展整列,則可以在ListViewItems上設置Width或MaxWidth。

<ListView ScrollViewer.VerticalScrollBarVisibility="Disabled"> 
    <ListView.ItemsPanel> 
     <ItemsPanelTemplate> 
      <WrapPanel Orientation="Vertical"/> 
     </ItemsPanelTemplate> 
    </ListView.ItemsPanel> 
    <ListView.ItemContainerStyle> 
     <Style TargetType="ListViewItem"> 
      <Setter Property="MaxWidth" Value="100"/> 
     </Style> 
    </ListView.ItemContainerStyle> 

如果禁用水平滾動,但除非元件固定寬度將可能是笨拙的用戶你可以使用一個正常的水平WrapPanel爲好。

+0

Thanks Quartermeister,我試過了你的方法,但是它只創建了一列而不是3? – si618 2010-09-08 04:08:09

+1

@Si:這種方法將從單列開始,隨着元素數量的增加而增加更多的列,而不是像單個行一樣開始並添加更多的行,所以如果你有足夠少的元素,那麼只會有一列。你有沒有在允許垂直滾動的面板?它只會在垂直空間不足時創建額外的列,這就是爲什麼我禁用了ListView上的垂直滾動條的原因,但是如果ListView本身位於ScrollViewer中,那麼它仍然可以垂直擴展。 – Quartermeister 2010-09-08 11:41:54

+0

乾杯Quartermesiter,解釋它! – si618 2010-09-16 03:02:40