当前位置:编程学习 > C#/ASP.NET >>

基于GridView LoadMoreAsync 设计的横向双向瀑布流 组件 源码分享

原理:
实现了ISupportIncrementalLoading 接口
完成了增量加载,
针对于本地对象无法释放的情况 增加了 相关的Func
同时 通过VisualTree 拿到了GridView中 HorizontalBar 来对滚动条的位置进行捕捉 与计算
通过计算后 来执行 虚化操作
 
如需 转载请声明博客作者
 
以下是源码:
 
IncrementalLoadingCollection 对象:
[csharp]  
public class IncrementalLoadingCollection<T> : ObservableCollection<T>, ISupportIncrementalLoading  
   {  
       // 是否正在异步加载中  
       private bool _isBusy = false;  
  
       // 提供数据的 Func  
       // 第一个参数:增量加载的起始索引;第二个参数:需要获取的数据量;第三个参数:获取到的数据集合  
       private Func<int, int, List<T>> _funcGetData;  
       // 最大可显示的数据量  
       private uint _totalCount = 0;  
  
       private Func<T, T> _actDisposeData;  
  
       public int PageIndex = 0;  
  
       public uint perCount = 0;  
  
       /// <summary>  
       /// 构造函数  
       /// </summary>  
       /// <param name="totalCount">最大可显示的数据量</param>  
       /// <param name="getDataFunc">提供数据的 Func</param>  
       public IncrementalLoadingCollection(uint totalCount, Func<int, int, List<T>> getDataFunc, Func<T, T> actDisposeData)  
       {  
           _funcGetData = getDataFunc;  
           _totalCount = totalCount;  
           _actDisposeData = actDisposeData;  
       }  
  
       /// <summary>  
       /// 是否还有更多的数据  
       /// </summary>  
       public bool HasMoreItems  
       {  
           get { return this.Count < _totalCount; }  
       }  
  
       /// <summary>  
       /// 异步加载数据(增量加载)  
       /// </summary>  
       /// <param name="count">需要加载的数据量</param>  
       /// <returns></returns>  
       public IAsyncOperation<LoadMoreItemsResult> LoadMoreItemsAsync(uint count)  
       {  
           perCount = count;  
           if (_isBusy)  
           {  
               return AsyncInfo.Run((token) => Task.Run<LoadMoreItemsResult>(() =>  
               {  
                   return new LoadMoreItemsResult { Count = (uint)this.Count };  
  
               }, token));  
           }  
           _isBusy = true;  
  
           var dispatcher = Window.Current.Dispatcher;  
  
           return AsyncInfo.Run(  
               (token) =>  
                   Task.Run<LoadMoreItemsResult>(  
                      async () =>  
                      {  
                          try  
                          {  
                              //// 模拟长时任务  
                              await Task.Delay(100);  
  
                              // 增量加载的起始索引  
                              var startIndex = this.Count;  
  
                              await dispatcher.RunAsync(  
                                   CoreDispatcherPriority.Normal,  
                                   () =>  
                                   {  
                                       PageIndex++;  
                                       // 通过 Func 获取增量数据  
                                       var items = _funcGetData(startIndex, (int)count);  
                                       if (items != null)  
                                           foreach (var item in items)  
                                           {  
                                               this.Add(item);  
                            &nbs
补充:软件开发 , C# ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,