为什么活动指示器在Xamarin.forms中不起作用?

时间:2016-03-15 10:03:02

标签: c# xamarin xamarin.forms portable-class-library

我正在尝试显示ActivityIndicator在我尝试更新DataBase上的列字段时按下按钮后,它没有出现?有什么问题?

以下我的代码:

ActivityIndicator ai = new ActivityIndicator()
            {
                HorizontalOptions = LayoutOptions.CenterAndExpand,
                Color = Color.Black
            };
            ai.IsRunning = true;
            ai.IsEnabled = true;
            ai.BindingContext = this;
            ai.SetBinding(ActivityIndicator.IsVisibleProperty, "IsBusy");

            ProcessToCheckOut = new Button { Text = "Set Inf" };
            ProcessToCheckOut.Clicked += (object sender, EventArgs e) =>
            {
                this.IsBusy = true;
                UserUpdateRequest user=new UserUpdateRequest();
                user.userId = CustomersPage.ID;
                appClient.UpdateInfo(user);                  
                this.IsBusy = false;
                Navigation.PushAsync(new CheckoutShippingAddressPage(appClient));
            };
         Content = new StackLayout
            {
                Children={
                tb,
                ai,
                ProcessToCheckOut
                }
            };

2 个答案:

答案 0 :(得分:10)

this.IsBusy=true;this.IsBusy=false;之间的代码都不是异步的。所以发生的事情是你启用指标,然后继续在主线程上工作,然后在UI有机会更新之前禁用指标。

要解决此问题,您需要将appClient.UpdateInfo(user)放入异步代码块(以及PushAsync和禁用活动指示器以及可能的其他一些代码)。如果您没有UpdateInfo()的异步版本,那么您可以将其推送到后台线程...假设它所做的任何工作实际上对于在后台线程中运行是安全的。

ProcessToCheckOut.Clicked += (object sender, EventArgs e) =>
{
    this.IsBusy = true;
    var id = CustomersPage.ID;
    Task.Run(() => {
        UserUpdateRequest user=new UserUpdateRequest();
        user.userId = id;
        appClient.UpdateInfo(user);
        Device.BeginInvokeOnMainThread(() => {
            this.IsBusy = false;
            Navigation.PushAsync(new CheckoutShippingAddressPage(appClient));
        });
    });
};

请注意,一旦后台工作完成,我还使用Device.BeginInvokeOnMainThread()将执行编组回主线程。这并不总是必要的,但这是一种很好的做法。

答案 1 :(得分:0)

你可以在Xamarin.Forms中使用ACR.UserDialogs,你会发现很容易:

UserDialogs.Instance.ShowLoading("Loading..."); 
UserDialogs.Instance.HideLoading(); 

查看acr github

中的示例