C# Xamarin.Forms CollectionView无限卷轴在一段时间后冻结
我用CollectionView和ItemSource=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
照片制作了一个滚动应用程序,在滚动一段时间后,该应用程序被冻结。
这是我的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;
}
}