マイクロソフト エバンジェリストのブログ

日本マイクロソフトのエバンジェリストが、技術情報を発信するブログです!

【相談科】 タイルから起動したときに特定のページを表示する方法について

エバンジェリスト高橋です。

相談科にご質問をいただいたのでご紹介します。みなさんも開発で悩んだら http://aka.ms/8clinic までご相談ください。

相談内容

app.xaml.cs の起動時の処理を実装して、主タイルから起動された時はMainPage、セカンダリタイルから起動された時は ChildMainPageを表示するようにしてあります。

今、主タイルから起動してMainPageにいるときに、スタート画面からセカンダリタイルをタップするとChildMainPageに遷移します。これはやりたい動作です。この状態(もしくはセカンダリタイルから最初に起動)した状態で、スタート画面から主タイルをタップしてもMainPageに遷移してくれません(OnLaunched
イベント自体がおこらない?)。希望としては、ここでMainPageに移ってほしいと思っています。

どのようにすれば希望通りの動作ができますでしょうか。

タイルの挙動は Windows Phone とちょっと違うところもあるんですよね。まさに今回のこれはその部分です。

状況

さて、まずは問題の整理をします。

まず、2つのタイルがあります。

  • Windows 8 にアプリをインストールしたときに作られるタイル:メインタイル
  • アプリケーションから作られたタイル:セカンダリタイル

どちらのタイルをタップしてもアプリが起動するだけですが、起動時(app.xaml.cs )にタイルの情報を見て主タイルから起動したのか、副タイルから起動したのか判断しています。

実装では、app.xaml.cs の OnLaunched イベントで以下のような処理を実装されています。

  • セカンダリタイルから起動された場合、ChildMainPge を起動
  • それ以外(メインタイル)の場合、MainPageを起動 ← 今回の問題

ところが、すでに ChildMainPage を開いている場合に、メインタイルをタップしても、アプリが前面に出てくるだけで、MainPageに移動しないということが、今回の問題です。

 

原因:

さて、この原因ですが、質問の中でも言われていましたが 「メインタイルから起動した場合 Onlaunched イベントはキックされない!」せいです。つまり、どうあがいても主タイルから起動してページコントロールはできないんですね。

ですので、メインタイルからの起動画面のコントロールは、あきらめるのが早道です。

 

解決方法:

ではどうしたらいいか?

いくつか方法はありますが、1つの方法として 「MainPage 起動用と、ChildMainPage起動用にセカンダリタイルを2つ作る」 方法です。

  • セカンダリタイル1から起動された場合、MainPge を起動
  • セカンダリタイル2から起動された場合、ChildMainPge を起動

こうすれば、思うように動作するはずです。

でも、「メインタイルを間違えて押してしまう」「メインタイルの役割がわからない」 という問題も起きてしまう可能性があります。この問題は UX 的な解決が適切でしょう。つまり、

  • 特定ページに移動する(機能を持った)セカンダリタイルx2と、メインタイルのデザインをきっちり違うものにする
  • セカンダリタイルの役割がわかるようなタイトルやデザインにする

という方法です。シンプルですが、ユーザーから見たらより分かりやすい解決になると思います。

なお、Windows 8.1ではアプリケーションをインストールしてもメインタイルは自動的に作成されなくなりました。ですので、今回の問題については、メインタイルができない分後半の問題は発生しなくなるので安心です。

募集中

また開発で悩んだら http://aka.ms/8clinic までご相談ください。