もう少し本格的なアプリケーションを作ってみましょう。ツイート機能搭載の音楽プレーヤーです。プレーヤー画面とプレイリスト画面で構成し、プレイリストは2枚のページをタップあるいは左右へのフリックで切り替えられる「ピボットページ」として作成します。プレーヤーの仕様については図20を参照してください。

図20●ここで作成する音楽プレーヤー
図20●ここで作成する音楽プレーヤー
[画像のクリックで拡大表示]

XAMLによる画面設計

 プロジェクトを作成しましょう。数当てゲームと同様に、新規プロジェクト作成ダイアログで「Windows Phone アプリケーション」を選択し、名前は「MusicPlayer」としてください。プロジェクトを作成したら、図20の左端の画面を参考にしてコントロールを配置します。ここでは、コントロールを大まかに配置しながら、XAMLのコードを直接編集していきます。

 リスト2は画面設計を終えた後のXAMLコード(MainPage.xaml)です*6。ポイントは二つあります。

 一つは、Prev.、Play、Nextの各ボタンを横に並べているところです。ここでは三つのボタンをStackPanelの中に入れています(リスト2の(1))。StackPanelは、縦または横にコントロールを並べるためのレイアウト専用コントロールです。ここでは横方向にボタンを並べたいので、OrientationをHorizontalに指定しています。縦方向にしたい場合はVerticalにします。

 もう一つは、ApplicationBarコントロールです(リスト2の(2))。これを使用すると、画面下にアイコンやメニューを設置できます。ここでは、プレーヤーの画面からプレイリスト画面へ移動するためのメニューを設置しています。ApplicationBarでメニューを設定する場合は、XAML上でClickイベントを設定しておく必要があります(同(2-1))。

タイマーの割込処理とメニューによる画面遷移

 コードを記述していきましょう。完成したコード(MainPage.xaml.cs、リスト3)から、ポイントになる部分について説明します。

 このプレーヤーは、Windows Phoneのメディア管理ソフト「Zune」のメディアライブラリを使って楽曲の情報や楽曲データにアクセスします。メディアライブラリにアクセスするには「XNA Framework」と呼ばれるゲーム開発向けのライブラリを使用する必要があります。

 Windows PhoneアプリケーションのプログラムはそのままではXNA Frameworkを利用できないので、「参照の追加」を行います。具体的には、ソリューションエクスプローラーで「参照設定」を右クリックして「参照の追加」を選び、現れるダイアログで「Microsoft.Xna.Framework」を選択してOKボタンを押します。

 参照の追加をしたら、using宣言文を記述して、プログラム内でこれらの機能を使えるようにします。ほかに、再生時間などの情報を一定間隔で更新するためのタイマー、曲情報に含まれるアルバム画像を表示するためのライブラリ、Twitterへ投稿するためMeハブへアクセスするためのライブラリを使えるようにusing宣言しています(リスト3の(1))。

 このプログラムでポイントになる処理は
・タイマー割り込みによるライブラリやメディアプレーヤーの情報更新
・各ボタンのクリック時の処理
・Twitterへの投稿
・メニューの「プレイリスト」をタップしたときの処理
です。タイマーによる割り込み処理ではDispatcherTimerでタイマーを定義し、50ミリ秒ごとにタイマーの割り込み処理(リスト3の(2-1))を起動してライブラリやメディアプレーヤーの情報を更新するようにしています。DispatcherTimerは複数定義すると、予期せぬ動作をすることがあるので、一つだけ起動させて、その中に複数の処理を列挙します。割り込み処理は、ここではラムダ式と呼ばれる構文を用いて記述しています。

 各ボタンのクリック時の処理もラムダ式で記述しています(リスト3の(2-2))。ラムダ式でイベント発生時の処理を記述すると、XAMLファイルにイベント定義を記述しなくても済むので、デザイナーと協業する場合などXAMLとプログラムを別々の担当者が作成する場合などに便利です

 Tweetボタンの処理では、Windows Phone OSの機能であるMeハブからTwitterに投稿できるようにしています(リスト3の(2-3))。Meハブへは、ShareStatusTaskクラスを使ってアクセスします。ShareStatusTaskオブジェクトのStatusプロパティに投稿内容を設定すると、ShowメソッドでMeハブを表示できます。表示されたMeハブには、Statusプロパティに設定した投稿内容が既にセットされていますから、あとは送信ボタンをタップするだけです。

 メニューを選択したときの処理では、NavigationServiceクラスのNavigateメソッドを呼び出すことでプレイリスト画面に遷移しています(リスト3の(3))。Navigateメソッドの引数には、遷移先画面のURIをセットします。