2016-07-25 2 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はビューIであります私のActivityIndi​​catorを収めているxamlファイルにあります。私の主な問題は、Navigation.PushAsync()を呼び出すと、ActivityIndi​​catorのアニメーションが停止されることです。私がこれを読んだところによると、両方の操作がメインスレッド上で発生するため、一方が他方に割り込むためです。

指標を表示する必要がある理由は、XLabsカレンダーコントロールがあるため、SchedulePageのレンダリングに時間がかかるためです。

このようなものを実装するにはどうしたらいいですか?

+0

メインスレッドでUIを初期化する必要があります。そのため、途中で取り除くことはできません。あなたができることは、カレンダーコントロールのデータロードとpupulatingが非同期の方法で行われることを確認することです。 –

+0

これは、CalendarViewソース内のすべての複雑なクラスをサーフィンすることと、それがどのように一緒になるかを考え出すことであり、私はC#に精通していません。私は考えられる頭痛を避けるための簡単なアプローチを探しています。私はここで厳しいスケジュールをとっています:S今のところ、それをそのまま残しています、活動指標の単純な存在。紡績は、ユーザーに何か起こっていることを知らせるのに十分でなければならないと思います... – Tharkius

+0

データのロードが非同期で行われるかどうかを確認するには、コンストラクタで行ったり、ナビゲートしたりしないでください。その意味。複雑なデータを使用したパフォーマンスは、厳密なスケジュールのためのものではありません。 :P –

答えて

0

昨日、PushAsyncの前にアクティブ化したときに表示されないActivityIndi​​catorがあるため、このケースを調査していました。私はここで見て、Stackoverflowとすべてのソリューションポイントは、Task.Run内のDevice.BeginInvokeOnMainThread内でPushAsyncを実行するために、私はそれを試みたが何も変更されません。

私は、PushAsyncが実行される前にActivityIndi​​catorの時間を稼ぐ別の非同期タスクが必要だと思いました。

別のプロパティを設定するjotadeの
//不要のフォローアップとして、
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

//、ちょうどXAMLでTrueに設定IsRunningと

に従ってください:だからここのコードは、私のプロジェクトで動作しています
 -- 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

関連する問題