统一安排儿童的虚拟化面板

Virtualized panel that arranges children uniformly

我正在尝试使用一个 GridView 来统一安排它的子项,很像 Community ToolkitUnifromGrid,但是一个虚拟化的。

我不能使用 GridView 的默认 Itemspanel 的原因是我认为它由第一个单元格决定所有其他单元格的大小,看这个:

请注意右侧的空白区域,并且尺寸较大的项目将按照第一个项目的大小进行裁剪。

我尝试使用 `UniformGrid',但它不是虚拟化的,而且我的应用程序实际上有时会遇到问题,并且当有很多项目时变得非常迟钝。

我还尝试扩展 VirtualizingPanel 以创建自定义 Panel,但是 it's not possible for now.

我现在可以做些什么来解决这个问题吗? 谢谢。

使用 Windows 社区工具包中的 AdaptiveGridView control 怎么样?它将允许您根据可用宽度自动调整项目的大小。然而,使项目完全正方形将是一个挑战,因为它会随着 window 扩展的方式改变宽度。

选项 1: 如果您不介意固定大小的单元格,您可以在 ItemsPanel 上指定它。

<GridView>
    <GridView.ItemsPanel> 
        <ItemsPanelTemplate>
            <ItemsWrapGrid Orientation="Horizontal" ItemHeight="200" ItemWidth="200"/>  
        </ItemsPanelTemplate> 
    </GridView.ItemsPanel> 
</GridView> 

选项 2: 在 Microsoft 的 WinUI NuGet 预发布版本中,有一个名为 "Repeater" 的新列表控件,与它的 "UniformGridLayout" 一起可以为所欲为。

目前您可以在此处的 XamlControlsGallery 存储库中找到此示例:https://github.com/Microsoft/Xaml-Controls-Gallery/blob/master/XamlControlsGallery/ControlPages/ItemsRepeaterPage.xaml

请注意,这仍是预发布版本,因此文档非常少,并且控件表面积可能会更改(事实上,已经更改了几次)。 Repeater 也不是 Selector 或 ListView 的子项,因此您失去了自动 ItemContainers、SelectionModes、ItemClicking 等。您必须根据需要手动添加它们 - repeater 本质上是一个新的列表呈现基础 class更类似于 ItemsControl 而不是 GridView 或 ListView。

这需要注意 - 虚拟化仅在 17763 SDK 及更高版本上本地运行 - 在较低版本的 SDK 上,您还需要使用 ScrollAnchorProvider 来启用虚拟化,如示例的第 110 行所示。