ウィンドウ8(WinRT)のページに移動するときにパラメーターを渡す方法を示すサンプルはたくさんあります。しかし、パラメータを戻すためのヒントは見つかりませんでした。
状況:ユーザーは同じデータの詳細ページに移動します。データはによってページに渡されます
Frame.Navigate(typeof(DedtailsPage), data);
変更したデータを元に戻すにはどうすればよいGoBack()
ですか?
ウィンドウ8(WinRT)のページに移動するときにパラメーターを渡す方法を示すサンプルはたくさんあります。しかし、パラメータを戻すためのヒントは見つかりませんでした。
状況:ユーザーは同じデータの詳細ページに移動します。データはによってページに渡されます
Frame.Navigate(typeof(DedtailsPage), data);
変更したデータを元に戻すにはどうすればよいGoBack()
ですか?
データへの参照をどこかに保存し、戻ったときにそれを取得しますか?
また、アプリが一時停止された場合にフレームナビゲーションの状態を保存するためにサポートされているのは単純なタイプのみであるため、ページ間で単純な文字列または値以外のオブジェクトを渡さないことが最善であることに注意してください。
これは非常に悪い考えですが、通常はこれを使用します。
書くには:
フレームrootFrame=Window.Current.Content as Frame;
rootFrame.Tag = myObject1;
読むには:
フレームrootFrame=Window.Current.Content as Frame;
var myObject2 = rootFrame.Tag;
私はこれを処理するために別の選択をしました。私はXamarin開発者(Formsではありません!)なので、iOS、Android、Windowsのすべてのプラットフォームで同様のソリューションを探していたことを忘れないでください。
オブジェクトを渡したり、グローバルを格納したりするのではなく、イベントをとても楽しんでいます。したがって、PageB(子)からPageA(親)にデータを渡すための最良の選択は、イベントを介して通信することです。
注:iOSおよびAndroidでは、「ページ」から「ページ」に移動するときに、移動先のターゲットオブジェクトのインスタンスを渡すことでこれを行うことができます。iOSでは、カスタムUIViewControllerのインスタンスを作成します。Androidでは、カスタムフラグメントのインスタンスを作成します。これを行うと、イベントハンドラーをインスタンスにアタッチできます。
例:
var controller = new ExtrasViewController();
controller.ExtraSelected += ExtrasFragment_ExtraSelected;
controller.ExtrasCleared += ExtrasFragment_ExtrasCleared;
this.NavigationController.PushViewController(controller, false);
WinRTアプリでは、移動先のターゲットページの「タイプ」のみを渡すことができます。したがって、イベントハンドラーをページインスタンスにアタッチする唯一の方法は、呼び出し元のページからOnNavigatedFromメソッドを使用することです。したがって、PageAにいて、PageBにいくつかのイベントハンドラーをアタッチしたいとします。アクティブになる前に、PageAの「コードビハインド」を記述します。
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
base.OnNavigatedFrom(e);
var page = e.Content as ExtraBody;
if(page != null)
{
page.ExtraSelected += ExtrasFragment_ExtraSelected;
page.ExtrasCleared += ExtrasFragment_ExtrasCleared;
}
}