Xamarin.forms 如何在不阻塞用户界面的情况下,从web服务带来的数据创建选项卡页面?

Xamarin.forms 如何在不阻塞用户界面的情况下,从web服务带来的数据创建选项卡页面?,xamarin.forms,async-await,Xamarin.forms,Async Await,我正试图从web服务带来的数据在MasterDetailPage中创建一个选项卡式页面。 问题是我阻塞了用户界面,因为我必须等待JSON带来的任务,然后迭代它,并为TabbedPage的每个ContentPage创建相应的ViewModels 我的代码类似于: Mi TabbePage: <?xml version="1.0" encoding="utf-8" ?> <TabbedPage xmlns="http://xamarin.com/schemas/2014/forms

我正试图从web服务带来的数据在MasterDetailPage中创建一个选项卡式页面。 问题是我阻塞了用户界面,因为我必须等待JSON带来的任务,然后迭代它,并为TabbedPage的每个ContentPage创建相应的ViewModels

我的代码类似于: Mi TabbePage:

<?xml version="1.0" encoding="utf-8" ?>
<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MyProject.Views.MyTabbedPage"
             ItemSource={Binding Tabs}>
    <TabbedPage.ItemTemplate>
        <DataTemplate>
            <ContentPage Title={Binding Description}>
                ...
            </ContentPage>
        </DataTemplate>
    </TabbedPage.ItemTemplate>

</TabbedPage>
所有这些代码都会在API中使用数据时阻塞用户界面。 如何以正确的同步方式实现这一点,从而使我的接口保持反应性?
PS:我可以在我的应用程序的登录过程中下载我收集的东西,但是当TabbedPageDetailViewModel被实例化时,我仍然会有一些延迟。

在contentPage中添加activityindicator怎么样?例如:

<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             x:Class="App526.TabbedPage1">
  <!--Pages can be added as references or inline-->
    <ContentPage Title="{Binding des}" >
        <ActivityIndicator IsRunning="true" x:Name="page1ActIndictor" />
    </ContentPage>

    <ContentPage Title="{Binding name}" >
        <ActivityIndicator IsRunning="true" x:Name="page2ActIndictor" />
    </ContentPage>

    <ContentPage Title="{Binding age}" >
        <ActivityIndicator IsRunning="true" x:Name="page3ActIndictor" />
    </ContentPage>
</TabbedPage>

在代码隐藏中,使用messagingCenter停止activityindicator:

public TabbedPage1()
{
    InitializeComponent();

    MessagingCenter.Subscribe<Object>(this, "dataLoadFinish", (sender) =>
    {
        page1ActIndictor.IsRunning = false;
        page2ActIndictor.IsRunning = false;
        page3ActIndictor.IsRunning = false;
    });
}
公共选项卡page1()
{
初始化组件();
MessagingCenter.Subscribe(此为“dataLoadFinish”,(发件人)=>
{
Page1Actindicator.IsRunning=false;
page2actindicator.IsRunning=false;
page3actindicator.IsRunning=false;
});
}
加载完成后发送消息:

public class TabbedPageDetailViewModel 
{
    //...
    public void loadingTask() {

        //After finish loading data

        MessagingCenter.Send<Object>(this, "dataLoadFinish");
    }    
    //...
}
公共类选项卡PageDetailViewModel
{
//...
公共无效加载任务(){
//加载完数据后
发送(这是“dataLoadFinish”);
}    
//...
}

您可以在加载这些任务时添加一个。您必须等待这些任务,因为您需要api中的数据来为选项卡页的每个ContentPage创建相应的ViewModels。我无法放置activityindicator,因为activityindicator是一个视图,而选项卡页需要一组ContentPage。您应该创建一个占位符页,在收集数据,然后在加载数据后导航到选项卡页我尝试了这种方法,但是,在没有用户的情况下,无法使用活动指示器将页面自动导航到选项卡页面intervention@lavilaso这是不正确的。这种方法是不可行的,因为作为我的tabbedpage子页面的contentpages的标题也依赖于API带来的数据,因此,在尝试此操作时,我还收到了用户界面构建和阻塞的延迟。如果您没有来自API的数据,您如何显示contentpages的标题?也许放一个占位符?你别无选择,只能延迟用户界面的构建和阻塞。我尝试的最后一种方法是创建一个带有活动指示器的加载页面,该指示器在我的选项卡页面之前调用,这个页面实例化了我的TabbedPage的viewmodel,并通过LoagindPage在加载完我的viewmodel的所有内容后订阅的一个事件,此时我执行了PUASHANCH(新TabbedPage(viewmodel)),但由于某种原因,这种方法也会阻塞用户界面。
public TabbedPage1()
{
    InitializeComponent();

    MessagingCenter.Subscribe<Object>(this, "dataLoadFinish", (sender) =>
    {
        page1ActIndictor.IsRunning = false;
        page2ActIndictor.IsRunning = false;
        page3ActIndictor.IsRunning = false;
    });
}
public class TabbedPageDetailViewModel 
{
    //...
    public void loadingTask() {

        //After finish loading data

        MessagingCenter.Send<Object>(this, "dataLoadFinish");
    }    
    //...
}