WinUI中新增的Repeater

微软最近公布了一个UWP的UI库,具体可以看这里,类似于Android上support library。

经人提醒,这个UI库里面包含了一个全新的列表控件:Repeater。

以往在UWP上的列表基本上是使用ListView/GridView,或者去community toolkit里面找DataGrid之类的,对于基本的列表需求来说这是足够了,但是一旦想要自定义ItemsPanel,就会面临UI虚拟化失效和不支持ISupportIncrementalLoading的问题,ItemsStackPanel/ItemsWrapGrid能够实现UI虚拟化和支持ISupportIncrementalLoading的Panel,但是这两个类是sealed的,也就无法继承。如果需要一些高级的布局就只能从继承Panel开始完全自己实现measure和arrange并且从头开始写UI虚拟化,或者使用telerik的RadListView,但是telerik这个控件在使用的时候也遇到了一些问题。总的来说是一个比较麻烦的事情。

Repeater对UI虚拟化进行了解耦,一定程度上与Android的RecyclerView有相近之处,举个简单的例子:

<ScrollViewer>
    <controls:Repeater Name="ContentRepeater" 
             ItemsSource="{Binding ItemsSource}"
             Layout="{Binding Layout}"
             ViewGenerator="{Binding ViewGenerator}" />
</ScrollViewer>

由于Repeater不处理滑动,外层没有ScrollViewer的话列表是无法滑动的。

ItemsSource是我们熟悉的ItemsSource,但是目前还不支持ISupportIncrementalLoading,由于官方文档还没出炉,目前还不清楚有没有除了手动监听ScrollViewer之外的其他办法

Layout与RecyclerView上的LayoutManager类似,是实现列表布局的组件,目前内置了通用的StackLayout、GridLayout和FlowLayout,可以通过继承VirtualizingLayoutBase来实现自己的Layout布局,比如说瀑布流布局。老样子,只需要override MeasureLayoutCore和ArrangeLayoutCore就可以实现布局,其中的参数除了Size之外,还有一个LayoutContext,在Repeater里面这个LayoutContext会是VirtualizingLayoutContext,在官方的Demo来看,似乎还需要手动记录缓存,我尝试不缓存,结果性能表现并不理想,尽管如此内存占用也比没有UI虚拟化的情况好。

ViewGenerator就与以前的ItemTemplate类似,但是把ItemTemplateSelector也集成了进来。

还有其他的一些API,在官方文档出炉之前就不瞎猜了。顺手改了个瀑布流的列表

WinUI目前还没有文档,有计划开源,等开源之后再来看看内部实现是怎么样的吧

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据