本稿に掲載したコードを試すだけなら、無償のExpressエディションやCommunityエディションで構わない。Windows(製品版)はマイクロソフトのページから無償で入手できる。Desktop」はデスクトップで動作するアプリ用)。4(製品版)もマイクロソフトのページから無償で入手できる。Packの日本語版を追加インストールする必要がある。本稿では、紛らわしくない限り次の略称を用いる。3/4も)では、残念なことにVB用のユニバーサルプロジェクトのテンプレートは含まれていない*6。そのため、本稿で紹介するコードはC#のユニバーサルプロジェクトだけとさせていただく*7。14」)からの提供となるようだ。Microsoft)」からの回答による。Team」のブログ記事(英語)によれば、PCLを使う方法のようである。本稿で説明するような画面遷移関連のコードをPCLに置くことは非常に困難である(PCLから画面に直接アクセスできないためであり、絶対に不可能というわけではない)。画面遷移の履歴を追加したいケースセカンダリタイルから起動できるアプリでは、メイン画面(=アプリ起動時に表示される画面)に戻れない(あるいは、戻る手順が複雑になる)場合がある。そこで画面遷移の履歴にメイン画面を追加できれば、[戻る]ボタンですぐにメイン画面に戻れるようになる。前回のサンプルコードでは、[メイン画面]→[画面A]→[画面B]→[画面C]→[メイン画面]という画面遷移を行った(エラー時の画面遷移は除く)。そこにセカンダリタイルから起動する機能を追加し、[画面A]を直接表示できるようにしてみよう(次の図)。すると、セカンダリタイルから起動したときの[画面A]は、Windowsでは[戻る]ボタンが表示されず、Phoneでは[戻る]ボタンのタップでスタート画面に戻ってしまう。セカンダリタイルから[画面A]を直接開くと、[メイン画面]に戻るのが困難になるセカンダリタイルからの起動時、単純に[画面A]を表示させた場合。Windowsでは[画面A]に[戻る]ボタンが表示されず、Phoneでは[戻る]ボタンをタップするとスタート画面に戻ってしまう。「[メイン画面]から遷移してきた」という履歴がないためである。この例では[画面C]まで進めば[メイン画面]へ遷移するボタンが使えるが、そうでなければ[メイン画面]を表示する手段がなくなってしまう。セカンダリタイルからの起動時に「[メイン画面]を表示した」という仮想的な履歴を追加できれば、この問題は解決するだろう。アプリからセカンダリタイルを作成できるようにするには、次のようなコードを記述する(このコードだけでは、作成したセカンダリタイルから起動しても[メイン画面]が表示されるだけである)。アプリ)]を選んでプロジェクトを作成し、WindowsとPhoneのそれぞれのプロジェクトに「MainPage.xaml」(=メイン画面)と「PageA.xaml」(=画面A)を追加する。「App.xaml.cs」ファイルを編集して、起動時に「MainPage.xaml」が表示されるようにする。「MainPage.xaml」にボタンを配置し、そのクリックイベントで「PageA.xaml」に画面遷移させる。「PageA.xaml」には、セカンダリタイルを作成するためのボタンを配置し、そのイベントハンドラーとしてこのコードにある「SetTile_Click」メソッドを記述する(「GetElementRect」メソッドは、「SetTile_Click」メソッド内から呼び出しているメソッド)。このコードは、共有プロジェクトに配置できる(=WindowsでもPhoneでも動作する)。別途公開のサンプルコードでは、コードビハインド全体を共有プロジェクトに置いている(共有プロジェクトの「View」フォルダー内)。セカンダリタイルのコンストラクターに渡したarguments引数の値(="PageA"、コメント(1))は、セカンダリタイルから起動されたかどうかの判定に使われる(後述)。上のコードで、スタート画面にセカンダリタイルを作成できるようになった。セカンダリタイルをタップしたときに[画面A]を表示する方法は、次で説明する。画面遷移の履歴を追加するには?画面遷移の履歴は、Frameコントロール(Windows.UI.Xaml.Controls名前空間)のBackStackプロパティに保持されている。BackStackプロパティは、PageStackEntryオブジェクト(Windows.UI.Xaml.Navigation名前空間)のリストである。従って、PageStackEntryオブジェクトを生成してBackStackプロパティに追加すればよい。メイン画面(=「MainPage」クラス)を表示したという履歴をBackStackプロパティの末尾に追加するコードは、次のようになる。null));メイン画面を表示したという履歴を追加するコード(C#)ここでrootFrame変数は、画面表示に使っているFrameクラス(Windows.UI.Xaml.Controls名前空間)のオブジェクトである。PageStackEntryクラスのコンストラクターの引数のうち、1つ目は必須で、履歴として残したい画面の型を与える。残り2つの引数はオプションだが、2つ目は画面に渡すパラメーター、3つ目は画面遷移の際のアニメーションである。履歴の任意の位置に挿入することも可能で、それにはAddメソッドではなく、Insertメソッドを使う。あとは、上のコードの応用である。前述のコードで作成したセカンダリタイルから起動されたときに[画面A](=「PageA」クラス)を表示するコードは、次のようになる。現在のウィンドウがアクティブであることを確認しますWindow.Current.Activate();}セカンダリタイルから[画面A]を表示するコード(C#)共有プロジェクトにある「App.xaml.cs」ファイルのOnLaunchedメソッドに太字の部分を追加する。セカンダリタイルでアプリが起動されたとき(=まだ画面を1つも表示していないとき)と、起動中にセカンダリタイルがタップされたとき(=すでに画面履歴が存在するとき)で、処理を切り分ける。前者の場合だけ、履歴を追加する(コード中のコメント参照)。このコードには含めていないが、[画面B]や[画面C]を表示しているときにセカンダリタイルをタップされた場合は、[画面A]までさかのぼって履歴を消してから[画面A]を表示する、という設計も考えられる。OnActivatedメソッドのオーバーライドが必要な場合は、そちらにも同様のコードを記述する。別途公開のサンプルコードでは、共通する部分をOnLaunchedメソッドとOnActivatedメソッドからくくり出して1つのメソッドにまとめてある。ちなみに、別解として、履歴を追加しない方法もある。実際に[メイン画面]を経由してから[画面A]を表示させても、同様な結果が得られるだろう。[メイン画面]を表示する処理が軽いならば、それでも構わない。その場合には、OnLaunchedメソッドで[メイン画面]へナビゲートしているコードの後ろ((1))に、[画面A]を表示するコードを追加すればよい。まとめ画面遷移の履歴を追加するには、履歴を表すPageStackEntryオブジェクトを生成し、それをFrameコントロールのBackStackプロパティに追加すればよい。例として取り上げたセカンダリタイルの場合では、まだ履歴が1つもないときだけ履歴を追加するようにした。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。