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");

我创建了一个小实例来更改 DisplayAlertActivityIndi​​cator 方法的内部状态。

这里是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" 
    />