Индикатор активности форм Xamarin не отображается - PullRequest
0 голосов
/ 30 августа 2018

Я занимаюсь разработкой приложения Xamarin Forms. Я хочу показать ActivityIndicator при получении данных и привязке их к элементу управления ListView из веб-API. В моем коде ActivityIndicator не отображается вообще. Я использую Visual Studio 2017 с Xamarin 4.10.

Ниже приведен мой код.

Код позади

[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class TestPage : ContentPage
{
    private SfListView listView;
    private ActivityIndicator activityIndicator;

    public TestPage()
    {
        InitializeComponent();

        StackLayout mainStackLayout = new StackLayout();

        activityIndicator = new ActivityIndicator()
        {
            IsRunning = true,
            IsEnabled = true,
            IsVisible = true
        };
        listView = new SfListView()
        {
            SelectionMode = SelectionMode.None,
            BackgroundColor = Color.White
        };

        mainStackLayout.Children.Add(activityIndicator);
        mainStackLayout.Children.Add(listView);

        this.Content = mainStackLayout;
        this.Title = "Dashboard";
    }

    protected override void OnAppearing()
    {
        SummaryRepository viewModel = new SummaryRepository();

        listView.ItemsSource = viewModel.Summary;
        listView.ItemTemplate = new DataTemplate(() =>
        {
            var grid = new Grid();

            var bookName = new Label
            {
                BackgroundColor = Color.White,
                FontSize = 16,
                TextColor = Color.FromHex("#1A237E")
            };
            var bookDescription = new Label
            {
                BackgroundColor = Color.White,
                FontSize = 16,
                HorizontalTextAlignment = TextAlignment.End,
                TextColor = Color.FromHex("#EC407A")
            };

            bookName.SetBinding(Label.TextProperty, new Binding("Name"));
            bookDescription.SetBinding(Label.TextProperty, new Binding("Amount"));

            grid.Children.Add(bookName);
            grid.Children.Add(bookDescription, 1, 0);

            return grid;
        });

        activityIndicator.IsRunning = false;

        base.OnAppearing();
    }
}

Файл XAML

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="eWallet.Pages.TestPage">
<ContentPage.Content>
    <StackLayout>

    </StackLayout>
</ContentPage.Content>

Любая помощь высоко ценится.

Ответы [ 3 ]

0 голосов
/ 30 августа 2018

Я полагаю, что метод OnAppearing синхронно извлекает данные и привязывает их к источнику списка, что означает, что при создании представления данные уже связаны, а activityIndicator.IsRunning = false; пропадает индикатор. Так что вы на самом деле не видите его работающим. Потому что при отображении представления привязка уже завершена, а индикатор равен false.

Одно из предложений заключается в том, что ..

Listview уже имеет свойство IsRefreshing, установите его на true, и вы увидите, что индикатор работает, false исчезает.

Вы также можете использовать от IsPullToRefreshEnabled до true, чтобы пользователь мог фактически свернуть представление списка, чтобы показать работающий индикатор, и вызвать команду обновления, чтобы вы могли выполнить метод обновления здесь.

Надеюсь, эта помощь

0 голосов
/ 30 августа 2018

Вероятно, то, что происходит, именно то, что сказал Luminous. Вы вызываете метод activityIndicator.IsRunning = false; для OnAppearing(), поэтому, если выборка идет быстро, вы не увидите индикатор активности. Попробуйте использовать Thread.Sleep(2000), чтобы проверить, так ли это.

0 голосов
/ 30 августа 2018

Используйте этот код:

<ContentPage.Content>
        <AbsoluteLayout HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
            <StackLayout BackgroundColor="#F5F5F5" VerticalOptions="FillAndExpand" AbsoluteLayout.LayoutFlags="All" AbsoluteLayout.LayoutBounds="0,0,1,1">
               //Your Listview
            </StackLayout>
            <StackLayout Padding="12" x:Name="DisplayLoading" IsVisible="False"
                 AbsoluteLayout.LayoutFlags="PositionProportional"
                 AbsoluteLayout.LayoutBounds="0.5,0.5,-1,-1">
                <ActivityIndicator Color="#d7813e" IsRunning="True"/>
                <Label Text="Loading..." TextColor="#d7813e" FontSize="Small"/>
            </StackLayout>
        </AbsoluteLayout>       
    </ContentPage.Content>

А в файле cs используйте:

protected override void OnAppearing()
    {
        activityIndicator.IsRunning = true;
        SummaryRepository viewModel = new SummaryRepository();

        listView.ItemsSource = viewModel.Summary;
        listView.ItemTemplate = new DataTemplate(() =>
        {
            var grid = new Grid();

            var bookName = new Label
            {
                BackgroundColor = Color.White,
                FontSize = 16,
                TextColor = Color.FromHex("#1A237E")
            };
            var bookDescription = new Label
            {
                BackgroundColor = Color.White,
                FontSize = 16,
                HorizontalTextAlignment = TextAlignment.End,
                TextColor = Color.FromHex("#EC407A")
            };

            bookName.SetBinding(Label.TextProperty, new Binding("Name"));
            bookDescription.SetBinding(Label.TextProperty, new Binding("Amount"));

            grid.Children.Add(bookName);
            grid.Children.Add(bookDescription, 1, 0);

            return grid;
        });

        activityIndicator.IsRunning = false;

        base.OnAppearing();
    }
...