2016-07-25 107 views
1

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

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

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

      MainPage = new NavigationPage(new LoginPage()); 
     } 
    } 

这是我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是一个视图我有关于我的ActivityIndi​​cator的xaml文件。我的主要问题是,当我调用Navigation.PushAsync()时,ActivityIndi​​cator的动画会停止。据我所读到的,这是因为两个操作都发生在主线程上,所以一个中断另一个。

我需要显示指标的原因是因为我的SchedulePage需要大量的渲染时间,因为它有一个XLabs日历控件。

你会如何去执行这样的事情?

+0

用户界面必须在主线程上初始化,所以你不能把它放在一边。你可以做的是确保数据加载和日历控制混合发生在一个异步的方式。 –

+0

这将涉及浏览CalendarView源代码中的所有复杂类,并弄清楚它是如何结合在一起的,而且我不是C#的专业人士。我正在寻找一种更简单的方法来避免任何可能的麻烦,我在这里的时间表很紧迫:S现在,我只是要保持原样,简单地存在活动指示器,尽管不是旋转,应该足以让用户知道发生了什么事情,我希望... – Tharkius

+0

也许确保数据加载异步发生(也就是不在构造函数或导航到)将足够,但基本上,是的,那就是这是什么意思。复杂数据的表现并不适合时间紧凑的情况。 :P –

回答

0

昨天我正在研究这种情况,因为我有一个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; 
      } 
     } 
    } 
} 
1

你应该尝试包装你的页面导航中是这样的:

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

这使得进程来启动,并保持你的UI元素响应。

+0

感谢您的建议,我会尽快尝试,然后告诉您。 – Tharkius

+0

不幸的是,它并没有解决问题,我仍然得到活动指标的动画停止。感谢您的时间;) – Tharkius

0

//作为后续jotade的
//无需设置另一个属性,只需设置IsRunning为True XAML,并做后续

 -- code remove for brevity 

     ActivityIndicator.IsVisible = true; 

     await Task.Delay(500); 
     try 
     { 
      await Navigation.PushAsync(new TransactionCalculationPage(), true); 
     } 
     finally 
     { 
      ActivityIndicator.IsVisible = false; 
     } 
+0

您的答案格式错误,请更新格式并在发布之前阅读SO指南。 – sparkplug