酢ろぐ!

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

Windows Phoneでアプリ起動時に遷移するルートページを切り替える

Visual StudioやExpression Blendのウィザードで作成したプロジェクトは、アプリケーション起動時に毎回MainPage.xamlから表示されますが、この動作は暗黙の仕様ではなくアプリケーションのマニフェストファイル上で明文的に定義されています。

例えばログイン状態や無償ユーザーに対しての告知をおこないたい場合など、アプリケーション起動時に表示されるルートページを切り替えたいというニーズがあります。起動時に表示するルートページを切り替えられるようにしてみましょう。

ソリューションエクスプローラーにてPropertiesフォルダに格納されているWMAppManifest.xmlを開きます。Tasks要素下にDefaultTask要素が定義されており、このタグがアプリケーション起動時に開くページを指します。

f:id:ch3cooh393:20160504113034p:plain

DefaultTask要素からNavigationPageプロパティの定義を削除します。

<Tasks>
    <DefaultTask  Name ="_default" />
</Tasks>

DefaultTask要素のNavigationPageプロパティを削除した状態でアプリケーションを起動すると、スプラッシュ画面で停止してしまいます。

アプリケーションを起動すると、ApplicationクラスのStartupイベントが発行されます。Startupイベント内にて起動するページを指定すれば、ルートページを切り替えることができます。Startupにイベントハンドラを設定してください。

<Application 
    x:Class="NavigationStartupTest.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"       
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" 
    Startup="Application_Startup">

次にコード側にイベントハンドラを追加します。下記のソースコードでは、ログイン状態や課金状態から起動するページを切り替えています。

private void Application_Startup(object sender, StartupEventArgs e) {

    // ログイン状態や起動回数、有償/無償状態での起動するページを切り替える
    if (なんらかのフラグ) {
        RootFrame.Navigate(new Uri("/MainPage.xaml", UriKind.Relative));
    } else {
        RootFrame.Navigate(new Uri("/SubPage.xaml", UriKind.Relative));
    }
}

以上で、アプリケーション起動時にルートページを切り替える方法は終わりです。