kazuakix の日記

Windows Phone とか好きです

セカンダリ タイルからの起動を判別する方法

セカンダリ タイルからアプリを起動した場合、呼び出されたページの OnNavigatedTo でパラメーターを取り出すことができます。

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    if (e.Parameter != null)
    {
        System.Diagnostics.Debug.WriteLine(e.Parameter.ToString());
    }
}

 
でも、アプリケーションが中断状態だった場合は単にアプリケーションが再開するだけで、OnNavigatedTo も呼ばれることはありません。

なので代わりに App.xaml.cs の OnLaunched で引数をチェックします。
ちょっと乱暴ですが 引数 e.Arguments がセットされていればセカンダリ タイルからの起動、無ければ通常起動という風に判断しました。

protected override void OnLaunched(LaunchActivatedEventArgs e)
{
    Frame rootFrame = Window.Current.Content as Frame;

    if (rootFrame == null)
    {
        // (省略)
    }

    if (rootFrame.Content == null)
    {
        // 新たに起動された場合

        // (省略)
        
        //if (!rootFrame.Navigate(typeof(MainPage), e.Arguments))
        //{
        //    throw new Exception("Failed to create initial page");
        //}
        if (string.IsNullOrEmpty(e.Arguments))
        {
            // 引数なし = 通常起動
            rootFrame.Navigate(typeof(MainPage), null);
        }
        else
        {
            // 引数あり = セカンダリタイルからの起動
            rootFrame.Navigate(typeof(SubPage), e.Arguments);
        }
    }
    else
    {
        // 中断から呼び出された場合
        if (!string.IsNullOrEmpty(e.Arguments))
        {
            // 引数あり = セカンダリタイルからの起動
            rootFrame.Navigate(typeof(SubPage), e.Arguments);
        }
     }
    
    Window.Current.Activate();
}

新たにアプリが起動した場合、中断から呼びされた場合で同じようなチェックが書かれているのがカッコ悪いので何とかしたいところです...。

また、セカンダリ タイルには表示すべきページの情報がないため、タイルに応じて表示ページを変えたい場合はパラメーターの中にページ名までを持たせた上で自前で判定する必要があります。
このあたり、Silverlight の方が扱いやすかったですね。