かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

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:誰か回避策知ってたら教えてください