DisplayAlert 方法仅在 Xamarin 中的方法结束时执行
DisplayAlert methods only executed at the end of the method in Xamarin
我正在编写一个小型 Xamarin.Forms 应用程序,我尝试执行一些操作,例如显示警报或显示 Activity 指示器。但是,我在代码中编写的所有内容都只在方法结束时执行,甚至 Activity Indicator,这当然不是目标。不同的警报甚至在 LIFO 中显示,因此代码中的最后一个警报首先出现。
这是 xaml.cs 中的代码:
private void btConnexion_Clicked(object sender, EventArgs e)
{
ai.IsRunning = true;
IsBusy = true;
LoginViewModel vm = (LoginViewModel)this.BindingContext;
DisplayAlert(AppResources.Sorry, "Beginning", "Ok");
try
{
DisplayAlert(AppResources.Sorry, "In the try", "Ok");
if (vm.Valide())
{
Task t = Task.Run(async () => { await vm.AuthentificationAPI(); });
if (!t.Wait(TimeSpan.FromSeconds(5)))
{
DisplayAlert(AppResources.Sorry, AppResources.TryAgainLater, "Ok");
}
if (t.IsCompleted)
{
GetAllData();
Application.Current.MainPage = new AppShell();
Shell.Current.GoToAsync("//main");
}
}
else
DisplayAlert(AppResources.Error, AppResources.MissingFieldsErrorMessage, "Ok");
}
catch (Exception ex)
{
DisplayAlert(AppResources.Sorry, AppResources.TryAgainLater + " (" + ex.Message + ")", "Ok");
}
finally
{
ai.IsRunning = false;
DisplayAlert(AppResources.Sorry, "Finally", "Ok");
}
DisplayAlert(AppResources.Sorry, "After finally", "Ok");
}
我在 .xaml:
中调用它的地方
<Button Text="{x:Static resource:AppResources.Login}"
x:Name="btConnexion"
BackgroundColor="#AADC14"
Padding="0,0,0,0"
Clicked="btConnexion_Clicked"/>
我在metohd里放了一些alerts,显示"In the try","Beginning"等等,如果我一步步调试代码,所有的alerts只在最后执行一次方法,而不是在编译期间。在 FILO 中,第一个是“最后之后”,然后是“最后”等。Activity 指标甚至没有显示,原因与我想的相同。
我不知道它是否改变了什么,但是 xaml 必须按照 xaml.cs:
中所写的进行编译
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class LoginPage : ContentPage
像下面这样在显示警报之前放置等待
await DisplayAlert ("Alert", "You have been alerted", "OK");
我创建了一个小实例来更改 DisplayAlert 和 ActivityIndicator 方法的内部状态。
这里是cs代码:
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
//For DisplayAlert you only need to add await before the method.
private async void btConnexion_Clicked(object sender, EventArgs e)
{
if ((sender as Button).Text == "test")
{
await DisplayAlert("sorry", "try again later", "Ok");
}
await DisplayAlert("end", "end", "Ok");
}
//For ActivityIndicator, I use Task.Delay to make the effect clearer
private async void Button_Clicked(object sender, EventArgs e)
{
ActivityIndicator indicator = new ActivityIndicator();
indicator.IsRunning = true;
indicator.IsVisible = true;
indicator.Color = Color.Black;
stacklayout.Children.Add(indicator);
await Task.Delay(3000);
indicator.IsRunning = false;
indicator.IsVisible = false;
}
}
这里是xaml代码:
<StackLayout x:Name="stacklayout">
<Button Text="test"
x:Name="btConnexion"
BackgroundColor="#AADC14"
Padding="0,0,0,0"
Clicked="btConnexion_Clicked"/>
<Button Text="ActivityIndicator" Clicked="Button_Clicked"></Button>
</StackLayout>
最后通过将 Activity Indicator 放在 GridView 的末尾而不是开头来解决问题,如下所示。所以 AI 在那里,但不可见,因为被 AbsoluteLayout 隐藏在背景中。
</AbsoluteLayout>
<ActivityIndicator
IsRunning="{Binding IsBusy}"
IsVisible="{Binding IsBusy}"
Color="Red"
VerticalOptions="CenterAndExpand"
HorizontalOptions="CenterAndExpand"
/>
我正在编写一个小型 Xamarin.Forms 应用程序,我尝试执行一些操作,例如显示警报或显示 Activity 指示器。但是,我在代码中编写的所有内容都只在方法结束时执行,甚至 Activity Indicator,这当然不是目标。不同的警报甚至在 LIFO 中显示,因此代码中的最后一个警报首先出现。
这是 xaml.cs 中的代码:
private void btConnexion_Clicked(object sender, EventArgs e)
{
ai.IsRunning = true;
IsBusy = true;
LoginViewModel vm = (LoginViewModel)this.BindingContext;
DisplayAlert(AppResources.Sorry, "Beginning", "Ok");
try
{
DisplayAlert(AppResources.Sorry, "In the try", "Ok");
if (vm.Valide())
{
Task t = Task.Run(async () => { await vm.AuthentificationAPI(); });
if (!t.Wait(TimeSpan.FromSeconds(5)))
{
DisplayAlert(AppResources.Sorry, AppResources.TryAgainLater, "Ok");
}
if (t.IsCompleted)
{
GetAllData();
Application.Current.MainPage = new AppShell();
Shell.Current.GoToAsync("//main");
}
}
else
DisplayAlert(AppResources.Error, AppResources.MissingFieldsErrorMessage, "Ok");
}
catch (Exception ex)
{
DisplayAlert(AppResources.Sorry, AppResources.TryAgainLater + " (" + ex.Message + ")", "Ok");
}
finally
{
ai.IsRunning = false;
DisplayAlert(AppResources.Sorry, "Finally", "Ok");
}
DisplayAlert(AppResources.Sorry, "After finally", "Ok");
}
我在 .xaml:
中调用它的地方 <Button Text="{x:Static resource:AppResources.Login}"
x:Name="btConnexion"
BackgroundColor="#AADC14"
Padding="0,0,0,0"
Clicked="btConnexion_Clicked"/>
我在metohd里放了一些alerts,显示"In the try","Beginning"等等,如果我一步步调试代码,所有的alerts只在最后执行一次方法,而不是在编译期间。在 FILO 中,第一个是“最后之后”,然后是“最后”等。Activity 指标甚至没有显示,原因与我想的相同。
我不知道它是否改变了什么,但是 xaml 必须按照 xaml.cs:
中所写的进行编译[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class LoginPage : ContentPage
像下面这样在显示警报之前放置等待
await DisplayAlert ("Alert", "You have been alerted", "OK");
我创建了一个小实例来更改 DisplayAlert 和 ActivityIndicator 方法的内部状态。
这里是cs代码:
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
//For DisplayAlert you only need to add await before the method.
private async void btConnexion_Clicked(object sender, EventArgs e)
{
if ((sender as Button).Text == "test")
{
await DisplayAlert("sorry", "try again later", "Ok");
}
await DisplayAlert("end", "end", "Ok");
}
//For ActivityIndicator, I use Task.Delay to make the effect clearer
private async void Button_Clicked(object sender, EventArgs e)
{
ActivityIndicator indicator = new ActivityIndicator();
indicator.IsRunning = true;
indicator.IsVisible = true;
indicator.Color = Color.Black;
stacklayout.Children.Add(indicator);
await Task.Delay(3000);
indicator.IsRunning = false;
indicator.IsVisible = false;
}
}
这里是xaml代码:
<StackLayout x:Name="stacklayout">
<Button Text="test"
x:Name="btConnexion"
BackgroundColor="#AADC14"
Padding="0,0,0,0"
Clicked="btConnexion_Clicked"/>
<Button Text="ActivityIndicator" Clicked="Button_Clicked"></Button>
</StackLayout>
最后通过将 Activity Indicator 放在 GridView 的末尾而不是开头来解决问题,如下所示。所以 AI 在那里,但不可见,因为被 AbsoluteLayout 隐藏在背景中。
</AbsoluteLayout>
<ActivityIndicator
IsRunning="{Binding IsBusy}"
IsVisible="{Binding IsBusy}"
Color="Red"
VerticalOptions="CenterAndExpand"
HorizontalOptions="CenterAndExpand"
/>