2017-12-04 15 views
-1

私はNavigation.PushAsyncを使用して新しいページに移動し、作業が完了したらPopAsyncを呼び出して前のページに戻ります。問題は、最初のページが新しいページをポップしてから何か作業を続けるのを待つ必要があることです。だから私はこのようにやっている:私は、新しいページが表示されたときDoOtherWork部分がすぐに実行されることが観察さPushAsyncは実行されずに実行されます

// source page: 
DoWork(); 
await Navigation.PushAsync(new TargetPage()); <== this does not wait for the page!?? 
DoOtherWork(); 

、それは却下されていないまで。しかし、ここではawaitを使用しています。つまり、非同期タスクが完了したら、後の部分を継続する必要があります。なぜNavigationタスクを待たずに実行されますか?

+0

に同じメッセージを購読する新しいページが表示されたときか、却下されたときにタスクが終了していますか?あなたは後者を想定しています。しかし、あなたの前提は正しいですか?あなたが描いていることから、私は前者が当てはまると思います。 – Fildor

+0

タスクは、ページの表示を管理するだけで、解雇を待つことはありません。それでは、どのようにしてナビゲーションが2つのページを結びつけますか – fluter

+0

こちらの例をご覧ください:https://developer.xamarin.com/api/member/Xamarin.Forms.INavigation.PushAsync/p/Xamarin.Forms.Page/解雇を待つためには、Popを待つ必要があるようです。 Returnのドキュメンテーション・テキストは私にとっては少し混乱しています。例と矛盾するようですか?多分それは私だけです。 – Fildor

答えて

3
await Navigation.PushAsync(new TargetPage()); 

このコードは、「待つ」「TargetPage」が可視化されるまで、そのコードは「OnOtherCode」に進みます。

TargetPageを閉じた後でコードを実行する場合は、Navigation.PopAsyncの後、または「TargetPageのOnDisappearing」イベントの後にこのコードを追加する必要があります。

別の解決策は、することができ:「TargetPageのOnDisappearing」イベントでMessagingCenter.Sendを使用して、呼び出しページ

+0

さて、わかりました。しかし、DoOtherWorkはソースページのデータにアクセスする必要があります。そのため、ターゲットページにポップアップした後ではなく、プッシュ後にその作業を行っています。 – fluter

+0

ソースページは "TargetPage"または "CallerPage"ですか? –

+0

ソースは 'PushAsync'を呼び出す最初のページで、ターゲットは' PopAsync'を呼び出して自分自身を閉じる第2ページです。 – fluter

関連する問題