WPF多列列表视图的最佳方法

时间:2010-09-08 03:02:48

标签: wpf listview uniformgrid

我有一个包含大量数据的ListView(200多个项目),所以为了节省空间,它使用UniformGrid显示3列而不是1

<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个或更多行。这意味着当组中只有1行需要额外的空间

时,组中的所有行都会占用2行或更多行

alt text

有谁知道如何解决这个问题,还是可以建议另一种方法来避免统一网格?谢谢!

1 个答案:

答案 0 :(得分: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>

如果禁用水平滚动,也可以使用普通的Horizo​​ntal WrapPanel,尽管除非元素是固定的宽度,否则可能对用户来说很尴尬。