为什么 Activity 指标在 Xamarin.forms 中不起作用?
Why Activity Indicator Not working In Xamarin.forms?
我正在尝试显示 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
}
};
None this.IsBusy=true;
和 this.IsBusy=false;
之间的代码是异步的。所以发生的事情是您启用了指示器,然后继续在主线程上工作,然后在 UI 有机会更新之前禁用指示器。
要解决此问题,您需要将 appClient.UpdateInfo(user)
放入异步代码块(以及 PushAsync 和禁用 activity 指示器以及可能的其他一些代码)。如果你没有 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()
将执行编组回主线程。这并不总是必要的,但这是一个很好的做法。
我正在尝试显示 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
}
};
None this.IsBusy=true;
和 this.IsBusy=false;
之间的代码是异步的。所以发生的事情是您启用了指示器,然后继续在主线程上工作,然后在 UI 有机会更新之前禁用指示器。
要解决此问题,您需要将 appClient.UpdateInfo(user)
放入异步代码块(以及 PushAsync 和禁用 activity 指示器以及可能的其他一些代码)。如果你没有 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()
将执行编组回主线程。这并不总是必要的,但这是一个很好的做法。