かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

Metro スタイル アプリのナビゲーションのパラメータには単純な型しか実質渡せないっぽい・・・

Windows 8 RP + Visual Studio 2012 RC時点の情報です。

Metro スタイル アプリでは、FrameクラスのNavigateメソッドを使って画面遷移を行う感じになってます。このNavigateメソッドのシグネチャを見てみると、object型のパラメータを渡せるようになっているので、何でもデータ渡せちゃう!と思える感じになってます。

実際に、以下のようなデータを定義してNavigateメソッドに渡してもとりあえず動きます。

public class Data
{
    public string Value { get; set; }
}

// ナビゲーション処理
rootFrame.Navigate(typeof(MainPage), new Data { Value = "値" });

ただし、このようにオブジェクトを渡してしまうとアプリケーションが背面に回った時にFrameの履歴を保持しようとすると問題が起きます。Frameの履歴を文字列にシリアル化したものを取得するメソッドとしてGetNavigationStateメソッドが提供されているので、これを保存しておけばOKです。

ただ、こいつが厄介でNavigateメソッドの引数で渡したパラメータまでがっちり保持していてクラスはシリアル化できないみたいなエラーを飛ばしてくれます。以下のような感じで…。

// オブジェクトを渡して画面遷移
rootFrame.Navigate(typeof(MainPage), new Data { Value = "値" });
// 意味ないけど呼んでみる
rootFrame.GetNavigationState();

DataクラスにDataContract属性をつけてみたりしましたが、うまくいく方法がわかりませんでした。ということで、今のところシンプルな文字列とか数値とか程度が渡せるといった程度で使うのがいいのかなと思いました。*1

*1:誰か回避策知ってたら教えてください