代码之家  ›  专栏  ›  技术社区  ›  si618

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

  •  2
  • si618  · 技术社区  · 14 年前

    我有一个包含大量数据(200多个项目)的列表视图,为了节省空间,它使用统一网格显示3列而不是1列。

    <listview.itemspanel>
    <项模板lt;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”/>
    &风格/风格;
    </setter.value>
    &;
    &风格/风格;
    </listview.resources>
    < /代码> 
    
    

    这是可行的,但是由于显示的数据长度不同,在项目组中仍然有浪费的空间,因为大多数数据适合于一行,但偶尔会有一个项目占用2行或更多行。这意味着当一个组中只有一行需要额外的空间时,该组中的所有行将占用2行或更多行。

    是否有人知道如何解决这个问题,或者可以建议另一种方法来避免使用统一网格?谢谢!

    <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行或更多行。

    alt text

    是否有人知道如何解决这个问题,或者可以建议另一种方法来避免使用统一网格?谢谢!

    1 回复  |  直到 14 年前
        1
  •  5
  •   Quartermeister    14 年前

    您可以使用垂直包装板并禁用垂直滚动。这将导致项目显示在列中,并在右侧添加其他列,类似于Windows资源管理器中的列表视图。如果不希望一行长文本展开整个列,则可以在ListView项上设置宽度或最大宽度。

    <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,不过除非元素的宽度固定,否则用户可能会感到尴尬。