当我的数据加载到Xamarin Forms时,如何使加载屏幕消失?

时间:2016-07-14 08:08:05

标签: c# listview xamarin xamarin.forms

我想在没有数据显示的情况下构建加载屏幕。但它不起作用,它会永远加载。如何在加载数据时使加载屏幕消失?

这是我的 C#代码

        if (Clublistview.ItemsSource == null)
        {
            try
            {
                base.OnAppearing();
                await setClubs(Clublistview);

                overlay.IsVisible = false;
                Clublistview.IsVisible = true;
            }
            catch (Exception ex)
            {
                //MessagingCenter
                await DisplayAlert("Error",
                    "There seems to be an error, please check your internet connection.",
                    "OK");
            }
        }
        else
        {
            overlay.IsVisible = true;
            Clublistview.IsVisible = false;
        }

这是 XAML代码

 <ListView  x:Name="Clublistview" HasUnevenRows="true" ItemSelected="OnItemSelected" ItemsSource="{Binding Id}" IsVisible="true">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell Height="55">
                            <StackLayout BackgroundColor="White"
                            Orientation="Vertical">
                                <StackLayout Orientation="Horizontal" Padding="2,2,2,2">
                                    <Image Source="{Binding Logo}" IsVisible="true" WidthRequest="50" HeightRequest="50"/>

                                    <StackLayout Orientation="Vertical">
                                        <Label Text="{Binding Name}" FontSize="20" x:Name="BtnClub" 
                                         TextColor="Black" />

                                        <Label HorizontalOptions="Start" Text="Select for more info" FontSize="10"/>
                                        <!--<Button BackgroundColor="White" TextColor="Black"  HorizontalOptions="Start" x:Name="btnInfo" 
                                        Text="Select for more info" FontSize="10" Clicked="OnInfoClicked" CommandParameter="{Binding Id}"/>-->
                                    </StackLayout>
                                </StackLayout>
                            </StackLayout>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
            <ContentView x:Name="overlay" HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand"  AbsoluteLayout.LayoutFlags="All" IsVisible="false">
                <ActivityIndicator  IsRunning="True" IsVisible="True" Color="Black" HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand"/>
              </ContentView>

2 个答案:

答案 0 :(得分:2)

看起来此代码放在OnAppearing的{​​{1}}方法上。如果是这种情况,则只会在显示页面时调用1次。假设ContentPage不为null,则执行此代码:

Clublistview.ItemsSource

这意味着您的叠加层可见,overlay.IsVisible = true; Clublistview.IsVisible = false; 将旋转。如果这不在ActivityIndicator中,那么我不确定你何时调用它所在的方法。

你可能想做这样的事情:

OnAppearing

您可以使用MVVM模式以更干净的方式实现此类行为。使用MVVM,您可以使用属性绑定来控制何时显示叠加层。我们有一些关于MVVM和Xamarin.Forms的指南,可以帮助您入门hereHere是一篇博文,也展示了一个例子。

答案 1 :(得分:1)

这对我有用:

protected override void OnAppearing()
{
    base.OnAppearing();
            
    this.layoutLoadingSpinner.IsVisible = true;
    this.layoutContent.IsVisible = false;

    // Load slow-loading model on a separate thread
    MySlowLoadingModel model = null;
    await Task.Run(() =>
    {
        model = new MySlowLoadingModel();
    });

    this.BindingContext = model;
    this.layoutLoadingSpinner.IsVisible = false;
    this.layoutContent.IsVisible = true;
}

(避免 async/await 的另一个选择是在 MainThread.BeginInvokeOnMainThread() 内调用 Task.Run

一个不幸的副作用是在第二个线程上运行的任何代码都变得非常难以调试。 Xamarin 调试器似乎不适用于多线程。