如何在ItemsWrapGrid中将ItemWidth设置为“自动”

时间:2019-05-02 11:48:09

标签: xaml uwp

Official documentation claims

  

ItemWidth

     

每个项目中包含的每个项目的布局区域的宽度   ItemsWrapGrid。默认值为Double.NaN,这将导致“自动”   布局行为。

此语句看起来不正确,因为最简单的示例证明了它是错误的:

<ListView>
    <ListView.ItemsPanel>
        <ItemsPanelTemplate>
            <ItemsWrapGrid Orientation="Vertical"/>
        </ItemsPanelTemplate>
    </ListView.ItemsPanel>
    <ListViewItem>One</ListViewItem>
    <ListViewItem>Two</ListViewItem>
    <ListViewItem>Little bit long Three</ListViewItem>
</ListView>

哪个呈现为:

screenshot

我可以手动设置宽度:

<ItemsWrapGrid Orientation="Vertical" ItemWidth="300"/>

但这不是我想要的。我希望ItemWidth自动调整为内容宽度。怎么做?

UPD:解决方案(某种程度上)

似乎没有直接简单的解决方案,因此,您可以使用Microsoft Community Toolkit的3rd party组件WrapPanel(在NuGet中进行搜索)来修复该错误。但是它的性能差,但不能超过5000个项目。

1 个答案:

答案 0 :(得分:1)

实际上,这不是官方文档所说的“错误”。 ItemsWrapGrid按行和列排列子级。因此,所有其他单元格都获得第一个单元格的宽度,如果不是那样,则您将没有行和列,因为不同的单元格将具有不同的高度和宽度,并将它们排列在行和列中会很复杂。

我想我知道您想要哪种类型的布局面板。名为FlowPane,我没有在UWP中找到此面板,但它们是exists in WinForms

但是,您可以编写自己的布局以实现所需子代的排列。如果您了解basics of layout,那么编写流布局就不会有问题。 问题是,即使您编写自己的布局面板并将其用作ItemsPanel之类的ItemsControl的{​​{1}},也不会具有 virtualization 作为GridView面板上有。如果ItemsWrapGrid有很多项目,那就麻烦了。 ItemsRepeater解决了虚拟化问题。因此,如果您要虚拟化,请使用它。

希望有帮助。

编辑:

我在社区工具包中找到了布局面板,它称为WrapPanel