【问题标题】:Asynchronously adding the child to stacklayout in xamarin form iOS以iOS的xamarin形式将孩子异步添加到stacklayout
【发布时间】:2018-05-25 04:59:41
【问题描述】:

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

我正在做如下,

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

如何使其异步。

【问题讨论】:

  • 你在哪里添加孩子(我假设在 xaml.cs 文件中)?从您的示例中,I4m 不确定异步加载子项会有所不同...它也会很快..如果创建子项的过程需要一些时间,您能否添加一些代码以便我们可以看到“整个”过程?

标签: ios xamarin stacklayout


【解决方案1】:

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

结果:

【讨论】:

  • 这个解决方案对我不起作用。它仍在同时加载所有视图。
  • @user8671622 基础是在后台线程中创建视图并将其添加到 UI/主线程中。如果你这样做,你应该没问题。
  • 谢谢,有帮助。我调用了异步方法并在该调用中创建了视图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-07
  • 2018-07-14
  • 1970-01-01
  • 2017-05-01
  • 1970-01-01
  • 2017-12-30
相关资源
最近更新 更多