NavigationServiceを使って画面遷移する(WP7)


WP7での印象的な画面レイアウトとしてプリインストールアプリのPeapleアプリなどで利用されている「パノラマ(Panorama)」や、
Settingアプリなどで利用されている「ピボット(Pivot)」やがありますが、今回は基本となる通常の画面遷移を行う方法を紹介します。

画面遷移を行うにあたって、作成するサンプルは2つの画面を持っています。
記事内では「MainPage」と「SecondPage」という具合に呼び分けることとします。
各画面の内容は以下のとおりです。
MainPage

Buttonを押下すると、SecondPageに遷移する。
遷移の際にTextBoxに入力されているテキストデータをSecondPageに引き渡す。

SecondPage

遷移先のページとなる。
MainPageのTextBoxに入力されていたテキストデータをTextBlockに表示する。

それではつづきをどうぞ。

遷移先のページを用意する

始めに遷移先のページを用意しましょう。
VisualStudioの画面右側、ソリューションエクスプローラーから、以下を選択します。
プロジェクト名を右クリック → 追加 → 新しい項目

表示されるポップアップウィンドウから、以下を選択します。
Windows Phone 縦向きのページ

以上の操作で、新しいページを追加することができます。
下図のように、SecondPage.xamlが表示されていることと思います。

WP7のプロジェクトでは、画面ごとにhoge.xamlが用意され、
画面の操作用の為のソースコードとしてXAMLごとにhoge.xaml.csが用意されます。
XAMLのデザインビューより、ボタンなどをダブルクリックすることで表示されるソースコードはこのhoge.xaml.csになります。

NavigationServiceクラスのNavigateメソッド

画面遷移の方法は非常に簡単です。
画面遷移には、以下表のNavigationServiceクラスのNavigateメソッドを使用します。

NavigationService.Navigate(Uri toUri)

引数用途
Uri toUri遷移先のUriを指定する

サンプルでの指定方法は以下のとおり。
MainPage.xaml.cs

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            NavigationService.Navigate(new Uri("/SecondPage.xaml?msg1=" + textBox1.Text, UriKind.Relative));
        }

ソースコード3行目のように、テキストデータをSecondPageに引き渡す為、Uriの中に含めています。

SecondPage.xamlに遷移するため、”/SecondPage.xaml”を指定しています。
また、”/SecondPage.xaml?msg1=(変数の中身)”という具合に、msg1という変数にtextBox1に入力されたデータを引き渡しています。

Uriに含まれたテキストデータを取り出す

ページを移動する場合に呼び出されるメソッドとして、以下メソッドがあります。

メソッド名呼び出されるタイミング
PhoneApplicationPageクラスOnNavigatedToメソッドページが呼び出される際にコールされる
PhoneApplicationPageクラスOnNavigatingFromメソッド次のページが呼び出される際に呼び出される。(buttonのクリックメソッドよりも先に呼ばれる)
PhoneApplicationPageクラスOnNavigatedFromメソッド次のページに切り替わる直前に呼び出される。

SecondPanel.xaml.csに「ページが呼び出される際にコールされる」メソッドである、OnNavigatedToメソッド内で
テキストデータを取り出します。
テキストデータは、NavigationContext クラスの QueryStringに格納されているため、以下メソッドで取り出すことができます。

NavigationContext.QueryString.TryGetValue(String key, out msg)
String keyUri内にて、?の直後に挿入した変数名
out msg取得するデータの格納先を指定する

サンプルでは、以下の様に記述しています。

SecondPage.xaml.cs

        protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);

            // 格納先の変数準備
            string inputVal = "";

            if (NavigationContext.QueryString.TryGetValue("msg1", out inputVal))
            {
                // textBlock1にて取得したデータを表示
                textBlock1.Text = inputVal;
            }

        }

4行目:格納先の変数を作成し、initializeを行っています。
6行目:TryGetValueメソッドを用いてQueryStringからデータを取得しています。取得できない場合はfalseとなります。
9行目:取得したデータをTextBlockに表示しています。

One Comment