読者です 読者をやめる 読者になる 読者になる

酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Windowsストアアプリで起動時に遷移する画面を切り替える

Visual StudioやExpression Blendのウィザードで作成したプロジェクトは、アプリケーション起動時に毎回MainPage.xamlから表示されるようになっています。

この動作は暗黙の仕様……というわけではなく、App.xaml.csで定義されているOnLaunchedイベントハンドラの処理の中で明示的に定義されています。このOnLaunchedイベントは、アプリケーションがユーザーによって起動されたときに呼び出されます。

不要な部分を省略して、MainPage.xamlへ遷移する処理だけを残したコードは以下の通りです。rootFrameのNavigateメソッドでMainPageクラスの型を指定して、画面遷移をおこなっていることが分かります。

protected override void OnLaunched(LaunchActivatedEventArgs e)
{

//~~~~ 省略 ~~~~

    if (rootFrame.Content == null)
    {
        // ナビゲーションの履歴スタックが復元されていない場合、最初のページに移動します。
        // このとき、必要な情報をナビゲーション パラメーターとして渡して、新しいページを
        // 作成します
        rootFrame.Navigate(typeof(MainPage), e.Arguments);
    }
    // 現在のウィンドウがアクティブであることを確認します
    Window.Current.Activate();
}

例えば、アプリケーションの初回起動時にログイン状態や無償ユーザーに対してのチュートリアル的なテキストを表示したい場合など、起動時に遷移する画面を切り替えたいことがあるかもしれません。

f:id:ch3cooh393:20131223011355p:plain

上図のように、アプリケーションの初回起動時にチュートリアル的なページを表示させた際に初回起動済みフラグを立てます。この初回起動済みフラグが立っていれば通常ページに遷移させます。

つまり、

  • 初回起動済みフラグが存在しない or フラグがfalseであれば、チュートリアルページ
  • 初回起動済みフラグがtrueであれば、通常ページ

に遷移させます。この挙動を実装したコードは以下の通りです。

protected override void OnLaunched(LaunchActivatedEventArgs e)
{

//~~~~ 省略 ~~~~

    if (rootFrame.Content == null)
    {
        var settings = Windows.Storage.ApplicationData.Current.LocalSettings;
        if (!settings.Values.ContainsKey("DidLaunched") 
            || (settings.Values.ContainsKey("DidLaunched") && (bool)settings.Values["DidLaunched"] == false))
        {
            // 一度も起動されたことがないのでチュートリアルページを表示する
            rootFrame.Navigate(typeof(TutorialPage), e.Arguments);

            // 一度チュートリアルページを表示したのでフラグを立てる
            settings.Values.Add("DidLaunched", true);
        }
        else
        {
            rootFrame.Navigate(typeof(MainPage), e.Arguments);
        }
    }
    // 現在のウィンドウがアクティブであることを確認します
    Window.Current.Activate();
}

これでアプリケーションの起動時に遷移する画面の切り分けができるようになりました。

サンプルプロジェクト

追記(2013/12/24 0:33)

もし画面遷移先のチュートリアルページを作る際には、@muu000さんが書いた記事が参考になります。合わせてお読みください。