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

发布于 2024-09-18 03:51:05 字数 994 浏览 3 评论 0原文

我有一个包含大量数据(200 多个项目)的 ListView,因此为了节省空间,它使用 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 行或更多行

img src="https://i.sstatic.net/dqcaT.png" alt="alt text">

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

I have a ListView with a lot of data (200+ items) so to save space it's making use of a UniformGrid to display 3 columns instead of 1

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

I also modify the style so that each item is aligned to the top

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

This works ok, however due to differences in the length of the data displayed, there is still wasted space in item groups because most of the data fits on a single line, but occasionally there is an item which takes up 2 or more rows. This means all rows in a group take up 2 or more rows when it's only 1 row that needs the extra space

alt text

Does anyone know how to fix this, or can suggest another approach to avoid the uniformgrid? Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

橘寄 2024-09-25 03:51:05

您可以使用垂直 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,但除非元素是固定宽度,否则可能会让用户感到尴尬。

You could use a vertical WrapPanel and disable vertical scrolling. That will cause the items to appear in columns with additional columns added on the right, similar to the list view in Windows Explorer. You can set Width or MaxWidth on the ListViewItems if you don't want a single line of long text to expand the entire column.

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

You could use a normal Horizontal WrapPanel as well if you disable horizontal scrolling, although unless the elements are fixed width that will probably be awkward for the user.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文