将新页面推送到导航时显示ActivityIndi​​cator

Tha*_*ius 5 c# xamarin.android xamarin xamarin.forms xlabs

我很难实现像在页面加载时显示ActivityIndi​​cator那样简单的功能,事实证明这非常困难。

这是我在App.xaml.cs上使用的代码:

public partial class App : Application
    {
        public App()
        {
            InitializeComponent();

            MainPage = new NavigationPage(new LoginPage());
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是我的LoginPage

public partial class LoginPage : ContentPage
    {
        public LoginPage()
        {
            InitializeComponent();

            btnLogin.Clicked += BtnLogin_Clicked;
        }

        protected async void BtnLogin_Clicked(object sender, EventArgs e)
        {
    loadingView.IsVisible = true;
    activityIndicator.IsRunning = true;

            await Navigation.PushAsync(new SchedulePage());

    loadingView.IsVisible = false;
    activityIndicator.IsRunning = false;
        }
    }
Run Code Online (Sandbox Code Playgroud)

无需赘述,loadingView是我在xaml文件上的视图,该文件包含我的ActivityIndi​​cator。我的主要问题是,当我调用Navigation.PushAsync()时,ActivityIndi​​cator的动画将停止。据我所读,这是因为两个操作都发生在Main线程上,所以一个中断了另一个。

我需要显示该指标的原因是因为我的SchedulePage需要很多时间来呈现,因为它具有XLabs日历控件。

您将如何实现这样的目标?

小智 2

昨天我正在调查这个案例,因为我有一个 ActivityIndi​​cator,当我在 PushAsync 之前激活它时它没有显示。我在这里看到了 stackoverflow,所有解决方案都指向在 Task.Run 内的 Device.BeginInvokeOnMainThread 内运行 PushAsync,我尝试了但没有任何变化。

然后我意识到我所需要的只是另一个异步任务,该任务在 PushAsync 运行之前为 ActivityIndi​​cator 提供时间。所以这是我的项目中的代码:

public partial class MyActivities : ContentPage
{
    private bool _isLoading;

    public bool IsLoading //Binded to ActivityIndicator
    {
        get { return _isLoading; }
        private set
        {
            _isLoading = value;
            OnPropertyChanged("IsLoading");
        }
    }

    public MyActivities()
    {
        BindingContext = this;
        InitializeComponent();

        btnNavitage.Clicked += async (s,a) => 
        {
            IsLoading = true;
            var animateEnd = await aiControl.FadeTo(1d); //aiControl is the ActivityIndicator, animate it do the trick
            try
            {
                await Navigation.PushAsync(new CheckInForm()); //when the code reach the PushAsync, ActivityIndicator is already running
            }
            finally
            {
                IsLoading = false;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)