bugfix> ios > 投稿

ループ内のstacklayoutに子として複数のビューを追加しています。すべての子が追加された後にのみページがレンダリングされます。追加された子と追加された子のロードサインを表示したいです。

私は以下のようにしています、

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

非同期にする方法。

回答 1 件
  • 最も簡単な方法は、バックグラウンドスレッドで「コンテンツ/ビューの作成」を実行し、そのコンテンツ/ビューをUIに追加する必要がある場合、メイン/ UIスレッド(BeginInvokeOnMainThread)に追加することです。

    非メイン/ UIスレッドでコンテンツ作成を実行します。
    Task.Run(async () =>
    {
        var itemsAdded = await AddContentAsync();
    });
    
    
    コンテンツ作成の例:

    注: CREATING CONTENT を「表示」します  ラベル、次に20個のボタンを作成し、メイン/ UIスレッドに一度に1つずつ追加し、追加されたとおりに新しいコンテンツにスクロールします。コンテンツが完成したら、先頭に戻って 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;
    }
    
    
    結果:

あなたの答え