Xamarin.forms 如何在不阻塞用户界面的情况下,从web服务带来的数据创建选项卡页面?
我正试图从web服务带来的数据在MasterDetailPage中创建一个选项卡式页面。 问题是我阻塞了用户界面,因为我必须等待JSON带来的任务,然后迭代它,并为TabbedPage的每个ContentPage创建相应的ViewModels 我的代码类似于: Mi TabbePage: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
<?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");
}
//...
}