Асинхронное добавление дочернего элемента к стековой структуре в xamarin форме iOS - PullRequest
0 голосов
/ 25 мая 2018

Я добавляю множественное представление как дочернее к стеку в цикле.Страница отображается только после добавления всех дочерних элементов.я хочу показать добавленных детей и загрузочный знак для добавляемых детей.

я делаю, как показано ниже,

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

Как сделатьэто асинхронный.

1 Ответ

0 голосов
/ 25 мая 2018

Самый простой способ - запустить «создание контента / представления» в фоновом потоке, а затем, когда вам нужно добавить это содержимое / представление в пользовательский интерфейс, добавить его в основной поток / поток пользовательского интерфейса (BeginInvokeOnMainThread).

Запустите создание контента в неосновном потоке / пользовательском интерфейсе:

Task.Run(async () =>
{
    var itemsAdded = await AddContentAsync();
});

Пример создания контента:

Примечание: мы «показываем» метку CREATING CONTENT, затем мы создаем20 Кнопки и добавляем их по одному в основной поток / пользовательский интерфейс, а также прокручиваем до нового содержимого по мере его добавления, как только содержимое будет завершено, мы прокручиваем обратно наверх и «скрываем» метку 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;
}

Результаты:

enter image description here

...