Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Xamarin.Forms CollectionView无限卷轴在一段时间后冻结_C#_Xamarin.forms_Collectionview - Fatal编程技术网

C# Xamarin.Forms CollectionView无限卷轴在一段时间后冻结

C# Xamarin.Forms CollectionView无限卷轴在一段时间后冻结,c#,xamarin.forms,collectionview,C#,Xamarin.forms,Collectionview,我用CollectionView和ItemSource=照片制作了一个滚动应用程序,在滚动一段时间后,该应用程序被冻结。 这是我的ViewModelconstructor代码,包含所有元素: public MainPageViewModel() { CounterData = 20; StandartCounter = 20; LoadPhotosCommand = new Command(e

我用CollectionView和ItemSource=
照片制作了一个滚动应用程序,在滚动一段时间后,该应用程序被冻结。
这是我的
ViewModel
constructor代码,包含所有元素:

        public MainPageViewModel()
        {
            CounterData = 20;
            StandartCounter = 20;
            LoadPhotosCommand = new Command(execute: async () => await ExecuteGetAllPhotos());
            LoadRefreshCommand = new Command(execute: async () => await ExecuteRefreshGetAllPhotos());
            LoadNewPhotosCommand = new Command(execute: async () => await ExecuteGetNewPhotos());
            LoadSelectedPhotoCommand = new Command(execute: async () => await ExecuteGetDetailsSelectedPhoto());
            Photos = new ObservableCollection<Photo>();
            PhotosAll = new ObservableCollection<Photo>();
            PhotosModel = new PhotosModel();
            SelectedPhoto = new Photo();
        }
这是
RemainingItemsThresholdReachedCommand
中的功能,逻辑是当用户达到滚动20个项目时,读取新的20个项目并将其添加到
照片
列表中

         async Task ExecuteGetNewPhotos()
        {
            if (IsBusy)
                return;
            try
            {
                IsBusy = true;
                await Task.Delay(100);
                foreach (var el in PhotosAll.Skip(CounterData).Take(StandartCounter))
                {
                    Photos.Add(el);
                }
                CounterData += StandartCounter;
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
                var msg = ex.Message;
            }
            finally
            {
                IsBusy = false;
            }
        }
第一次开始滚动非常好,但过了一段时间,应用程序被冻结。有人有同样的问题吗?或者有什么解决办法

更新
看起来像是
照片
列表看起来更大加载新项目的速度越来越慢

经过几个小时的代码检查,我学到了两件事:

  • RemainingItemsThreshold=“{Binding CounterData}”->CounteData是静态值,无法更改
  • 我为skip或u可以使用计数器数据或我使用
    StandartCounter
    ,实现了一个值,并为我缩放的
    RailCounter
    大列表中的当前元素位置计数实现了一个值。 在每一个回合中,你都从PhotosAll.Skip(RailCounter)读取数据。Take(StandartCounter)
  • RailCounter+=StandartCounter
    问题是计数器数据必须是静态的
    
    我在尝试用数千个项目构建嵌套的
    CollectionView
    时遇到了同样的问题。滚动时,应用程序会冻结几秒钟。就我自己而言,我通过拒绝使用
    CollectionView
    和使用
    StackLayout
    元素组合手动构建视图来解决了这个问题。这不是一个理想的解决方案,因为我在视图出现时有一个启动延迟,所以需要进行某种虚拟化,但这种方法对我来说更可取。@Miamy你能发送一些代码示例吗?你可以在这里找到:。请注意,这是一个非常原始的原型,将被重新设计,但你们可以捕捉到手动视图构建的主要思想。谢谢分享。别忘了接受答案。
             async Task ExecuteGetNewPhotos()
            {
                if (IsBusy)
                    return;
                try
                {
                    IsBusy = true;
                    await Task.Delay(100);
                    foreach (var el in PhotosAll.Skip(CounterData).Take(StandartCounter))
                    {
                        Photos.Add(el);
                    }
                    CounterData += StandartCounter;
                }
                catch (Exception ex)
                {
                    Debug.WriteLine(ex);
                    var msg = ex.Message;
                }
                finally
                {
                    IsBusy = false;
                }
            }