Neutral Scent

App developments & Gadgets

WP7アプリに動的なスプラッシュスクリーンを追加する(Mango以降対応版)

Download Sample Source Code
Windows Phone 7の標準テンプレートで使用する静止画の起動中画像はなんともさびしいものです。
特にアプリの初回起動時などは、起動前に各種の初期化処理やネットワーク処理を行いたいもの。なので、MainPage.xamlなどの前にアニメーションを入れたいわゆるスプラッシュスクリーンのページを挿入したくなります。
しかし、そのまま実装すると、MainPageで[Back]ボタンを押した時にスプラッシュスクリーンに戻ってしまいます。で、WP7.0まではいろいろとそこでテクニックが必要だったわけですが、Mango以降はわりと簡単に実装できます、というサンプル。
基本的な実装の流れ:

  1. スプラッシュのページを「SplashScreen.xaml」などとして追加
  2. WMAppManifest.xmlを編集して、デフォルト画面をSplashScreen.xamlに変更
  3. SplashScreen.xamlでアニメーションや画面遷移などを設定

まずは、プロジェクトにSplashScreen.xamlを追加します。(今回はルートに追加してますが任意のフォルダの下でも可)
次にWMAppManifest.xml要素を以下のように編集。



<Tasks>
<!--<DefaultTask Name ="_default" NavigationPage="MainPage.xaml"/>-->
<DefaultTask Name ="_default" NavigationPage="SplashScreen.xaml"/>
</Tasks>
あとは、SplashScreen.xamlを適当に実装して、

<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid x:Name="ContentPanel">
<ProgressBar IsIndeterminate="True"/>
</Grid>
</Grid>
SplashScreen.xaml.csはとりあえずこんな感じです。
OnNavigatedFrom()をoverrideしてNavigationService.RemoveBackEntry()しているのがキモですね。このページから去ろうとするときに、自分をページ遷移の履歴(BackStack)から削除しています。
OnNavigatedTo()でNavigationModeを見てGoBackとかやろうとするとBackStackがまだ空っぽで、CanGoBackがfalseの時に呼ぶんじゃないよ、と怒られてハマります。

public partial class SplashScreen : PhoneApplicationPage
{
public SplashScreen()
{
InitializeComponent();
LayoutRoot.Tap += new EventHandler<GestureEventArgs>(LayoutRoot_Tap);
}

void LayoutRoot_Tap(object sender, GestureEventArgs e)
{
NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.Relative));
}

protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{
NavigationService.RemoveBackEntry();
base.OnNavigatedFrom(e);
}
}

今回はTapイベントで遷移してるので、画面をタップしないと次に行きませんが、まぁ適当に処理が終わったらNavigate()するようにするといいでしょう。