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

ListView数据虚拟化概念和实现

  •  1
  • Werner  · 技术社区  · 6 年前

    我试图得到一个简单的ListView来执行,同时可能加载数千个项目。似乎实现这一点的最佳方法是使用虚拟化—特别是数据虚拟化。但我不能让它工作,或者我只是误解了概念。

    我有一个简单的存储库,从Sqlite返回如下POCO类:

    public async Task<IEnumerable<T>> FindAllAsync(Action<T> predicate);
    

    在XAML中,我有这样的东西:

    <Style x:Key="VirtualisedMetroListView" BasedOn="{StaticResource MetroListView}" TargetType="{x:Type ListView}">
        <Setter Property="ScrollViewer.CanContentScroll" Value="True" />
        <Setter Property="ScrollViewer.IsDeferredScrollingEnabled" Value="True" />
        <Setter Property="VirtualizingStackPanel.IsVirtualizing" Value="True" />
        <Setter Property="VirtualizingStackPanel.VirtualizationMode" Value="Recycling" />
    </Style>
    

    ListView使用的。现在我对“virtualzingstackpanel”或MahApps“VirtualisedMetroListView”一无所知,因为特别是对于后者,文档很少。但是上面的构造似乎对某些ppl有效?

    谢谢。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Andy    6 年前

    虚拟化面板是关于UI虚拟化而不是数据虚拟化的。

    用户界面专家建议最多向用户显示大约200行。任何更多,你应该过滤,这样用户就不必滚动滚动滚动。。。。找到他们要找的那一排。

    事实上,我建议你使用skip并接受linq。要么在存储库中添加另一个在内部执行此操作的方法,要么公开iqueryable而不是ienumerable。 使用异步调用获取前100条记录。 Foreach,sdd到你的边界observecollection。 通过等待释放ui线程任务。延迟(500)或者别的什么。 还有。。。一直跳过并获取,直到获得所有数据。