为什么Xamarin表格中的活动指示器不起作用?

pvcm50d1  于 2022-12-07  发布在  其他
关注(0)|答案(2)|浏览(155)

我试图显示ActivityIndicator在我试图更新数据库上的列字段时按下按钮后,它没有显示?问题是什么?
在以下"我的代码"上:

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
                }
            };
gstyhher

gstyhher1#

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()在后台工作完成后将执行封送回主线程。

tp5buhyn

tp5buhyn2#

您的端点必须是getasync或postasync,并带有await

相关问题