5

我在实现一个像在加载页面时显示 ActivityIndi​​cator 这样简单的功能时遇到了一些麻烦,事实证明这非常困难。

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

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

            MainPage = new NavigationPage(new 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;
        }
    }

在不深入细节的情况下,loadingView 是我在 xaml 文件中的一个视图,其中包含我的 ActivityIndi​​cator。我的主要问题是,当我调用 Navigation.PushAsync() 时,ActivityIndi​​cator 的动画会停止。根据我所读到的,这是因为这两个操作都发生在主线程上,所以一个会中断另一个。

我需要显示指示器的原因是因为我的 SchedulePage 需要大量时间来呈现,因为它有一个 XLabs 日历控件。

你将如何实施这样的事情?

4

3 回答 3

3

您应该尝试将您的页面导航包装成这样:

Device.BeginInvokeOnMainThread (async() => {
await Navigation.PushAsync(new SchedulePage());
});

这允许该过程启动并保持您的 UI 元素响应。

于 2016-07-25T19:02:45.307 回答
2

昨天我正在调查这个案例,因为我有一个在 PushAsync 之前激活它时没有显示的 ActivityIndi​​cator。我在这里看到了 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;
            }
        }
    }
}
于 2017-11-21T13:37:57.357 回答
0

//作为jotade的后续
//无需设置其他属性,只需在XAML中将IsRunning设置为True并执行以下操作

        -- code remove for brevity

        ActivityIndicator.IsVisible = true;

        await Task.Delay(500); 
        try
        {
            await Navigation.PushAsync(new TransactionCalculationPage(), true);
        }
        finally
        {
            ActivityIndicator.IsVisible = false;
        }   
于 2018-01-22T00:06:15.737 回答