首页 > 解决方案 > 以iOS的xamarin形式将孩子异步添加到stacklayout

问题描述

我将多个视图作为子视图添加到循环中的堆栈布局中。仅在添加所有子项后才呈现页面。我想显示添加的孩子和正在添加的孩子的加载标志。

我正在做下面的事情,

for(int i= 0; i<30;i++){ myStackLayout.Children.Add(myView); }

如何使其异步。

标签: iosxamarinstacklayout

解决方案


最简单的方法是在后台线程上运行“内容/视图创建”,然后当您需要将该内容/视图添加到 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;
}

结果:

在此处输入图像描述


推荐阅读