ios - 以iOS的xamarin形式将孩子异步添加到stacklayout
问题描述
我将多个视图作为子视图添加到循环中的堆栈布局中。仅在添加所有子项后才呈现页面。我想显示添加的孩子和正在添加的孩子的加载标志。
我正在做下面的事情,
for(int i= 0; i<30;i++){
myStackLayout.Children.Add(myView);
}
如何使其异步。
解决方案
最简单的方法是在后台线程上运行“内容/视图创建”,然后当您需要将该内容/视图添加到 UI 时,将其添加到主/UI 线程 (BeginInvokeOnMainThread)。
在非主/UI 线程上运行内容创建:
Task.Run(async () =>
{
var itemsAdded = await AddContentAsync();
});
内容创建示例:
注意:我们“显示”CREATING CONTENT
标签,然后我们创建 20 个按钮并在主/UI 线程上一次添加一个,并在添加时滚动到新内容,一旦内容完成,我们滚动回顶部并“隐藏”CREATING CONTENT
标签。
Task<int> AddContentAsync()
{
Device.BeginInvokeOnMainThread(() =>
{
topLayout.RaiseChild(loading);
loading.IsVisible = true;
});
int itemsAdded = 0;
for (itemsAdded = 1; itemsAdded < 21; itemsAdded++)
{
// Create your dynamic content view....
var newContentView = new Button
{
Text = itemsAdded.ToString(),
HorizontalOptions = LayoutOptions.CenterAndExpand
};
Device.BeginInvokeOnMainThread(() =>
{
dynamicStackLayout.Children.Add(newContentView);
(dynamicStackLayout.Parent as ScrollView)?.ScrollToAsync(newContentView, ScrollToPosition.End, true);
});
}
Device.BeginInvokeOnMainThread(() =>
{
(dynamicStackLayout.Parent as ScrollView)?.ScrollToAsync(0, 0, true);
loading.IsVisible = false;
topLayout.RaiseChild(scrollView);
});
return itemsAdded;
}
结果:
推荐阅读
- javascript - WordPress 子菜单的 jQuery 问题
- visual-studio-code - vscode中的未命名/超薄片段
- c - 使用位运算符检查位设置
- android - Paytm“网络错误”
- javascript - 如何检查合并单词中的 2 个相邻重复字符是否可以生成特定单词?
- python - 已解决 Python POST(如何“执行”一个 url?)
- sql - 如何从 Django ORM 中的多个表中进行选择?
- node.js - 无法使用节点 js 通过对话流获取输入上下文
- c++ - QT:如何在按下按钮时从 url 下载
- android - 从 FirebaseStorage 加载数据时 ProgressBar 被关闭