Windows 8

Windows 8 と Windows Phone 8 向けアプリのビルド

Joel Reyes

Windows 8 と Windows Phone 8 は、統一されつつあります。当面、両方のプラットフォーム向けのビルドに関心がある開発者は、両者の主な類似点と相違点を理解しておく必要があります。Windows 8 API と Windows Phone ランタイム AP I で現時点で共通している部分を把握しておけば、同じ知識、ツール、コード、および資産の多くを活用して、両方のプラットフォームを対象とするアプリを配信できるようになります。今回は、両方のプラットフォームの共通点と相違点を調べ、できることとできないことを把握して、両者を対象とするソリューションのビルドを始められるようにします。

ユーザー インターフェイス (UX) に一貫性があること、つまり、タイル、リッチ タッチ インターフェイス、アプリ バー、ナビゲーションを使用することにより、両プラットフォームを対象とするアプリの設計と実装がシンプルになります。API サーフェスの共通領域を採用することにより、多くのシナリオでのコードの共有が促進されます。C#、Visual Basic、C++、または両プラットフォームを対象とするハイブリッド型など、自身のアプリに適したテクノロジを選択できます。https://msdn.microsoft.com/ja-jp/library/windowsphone/develop/jj714089(v=vs.105).aspxの資料には、Windows Phone 8 と Windows 8 で動作するアプリの作成についての優れた情報が含まれ、両プラットフォームを対象にビルドするときにコードを最大限に再利用するコード共有技法が示されています。

特定領域の比較

両方のプラットフォームを対象に効率よくコードを記述するには、機能の大きな相違点と、一見似ているように思えても API や実装が異なる機能を把握する必要があります。このような機能については、コード再利用を試みないようにします。今回は、次の 3 つの主要分野を検討対象として調査します。

  • UX
  • データ モデルとサポート コード
  • プラットフォーム固有の機能

UX

フォーム ファクターは、クロス プラットフォーム アプリの UI を設計する際に重要な考慮事項になります。画面の解像度、画面のサイズ、デバイスの既定の向きなどの属性を考慮する必要があります。ユーザー エクスペリエンスが制限される特定のデバイスでのエクスペリエンスが最適になるように、UI は注意深く決定する必要があります。

Windows Phone 8 アプリに Windows ストア アプリの機能をすべて含める意味はなく、プラットフォームごとにネイティブな UX を設計すべきであることはすぐにわかります。図 1に、できる限り最高のエクスペリエンスを生み出すために考慮すべき UX の相違点の例を示します。

図 1 Windows Phone 8 と Windows 8 の UX 機能の比較

Windows Phone 8 Windows 8
片手でのタッチが最も一般的 片手や両手でのタッチ、マウス
カメラ、加速度計などのハードウェアに対する保証 特定ハードウェアに対する保証なし、実行時にチェックが必要
複数列コンテンツは避ける 複数行と複数列のコンテンツが適切に機能
画面に収まらないコンテンツは垂直にスクロール、アプリ バー領域に制限あり 画面に収まらないコンテンツは水平にスクロール、アプリ バー領域に余裕あり
戻るボタンはハードウェア装備 [戻る] ボタンは画面上
セマンティック ズームなし セマンティック ズームあり

XAML の名前空間: Windows 8 と Windows Phone 8 両方の UI 設計に XAML を使用するとしても、同じ XAML を両方のアプリに再利用できるとは想定しないようにします。2 つのプラットフォームには、ページのレイアウトや向き、XAML の名前空間、XAML のコントロールなど、再利用を困難にする大きな違いがあります。

どちらのプラットフォームにもたくさんのコントロールが存在しますが、所属する名前空間は異なります。たとえば、Windows 8 のコントロールに相当する Windows Phone のコントロールは Windows.UIXaml.Controls、Microsoft.Phone.Controls、Microsoft.Phone.Shell に散在していますが、Windows 8 のコントロールと共有コントロールの一部は System.Windows.Controls に含まれています。さいわい、XAML エディターを使用していれば、サポート対象外のコントロールの追加を試みると警告されます。しかし、XAML では条件付きコンパイルがサポートされないため、対象とするプラットフォームに合わせて実行時に名前空間を含める簡単な方法はありません。

XAML のコントロール: コントロールの各ライブラリは、対応するプラットフォーム向けに最適化されます。そのため、プラットフォームごとに独自のユーザー コントロールを個別に設計することを強くお勧めします。その結果、XAML 移植時のバグを減らし、各プラットフォームで一貫した UX を維持できるようになります。図 2に基本コントロールの一部を示します。

図 2 Windows Phone 8 と Windows 8 の基本コントロール

Windows Phone 8 Windows 8
ルート ページ要素は PhoneApplicationPage コントロール ルート ページ要素は Page コントロール
垂直にスクロールしながらコンテンツを表示する場合は LongListSelector コントロールを使用 垂直にスクロールしながらコンテンツを表示する場合は GridView を使用
コンテンツを水平にページ切り替えする場合は Pivot コントロールを使用 多数の項目をグループ セグメントにグループ化する場合は SemanticZoom コントロールを使用 (グループ化された項目ページ コントロールも使用可)
ApplicationBar コントロールを使用 AppBar コントロールを使用

Windows 8 Visual Studio テンプレートでは、LayoutAwarePage が作成されます。LayoutAwarePage は API そのものに含まれる Page コントロールのサブクラスで、以下の追加機能を提供して、デザインと UX の一貫性を確保しています。

  • アプリのビュー ステートと表示状態のマッピング
  • GoBack、GoForward、および GoHome の各イベント ハンドラー
  • ナビゲーション用のマウスおよびキーボードのショートカット
  • ナビゲーションの状態管理およびプロセス継続時間管理
  • 既定のビュー モデル

データ モデルとサポート コード

すべてのアプリでは、データを管理する必要があります。そして、データ モデルが最適なデータ管理を実現します。データ モデルを使えば、メンテナンスが容易になり、モジュール性やプロジェクト編成の効率が高まり、移植しやすくなります。また、データ モデルをサポートする API は、コードを再利用する際の適切な候補になります。そのうえ、コードを再利用する場合に、アプリのアーキテクチャやメンテナンスの容易性が犠牲になりません。共有ライブラリ、コード共有技法、モデル - ビュー - ビューモデル (MVVM: Model-View-ViewModel) のようなパターンを使えば、コードの再利用に役立つ可能性が高くなります。詳細については、Doug Holland の 6 月号の記事「Windows Phone 8 アプリと Windows 8 アプリでコードを共有する」(msdn.microsoft.com/magazine/dn201744) を参照してください。

プラットフォーム固有の機能

Windows 8 と Windows Phone 8 の両方で同じように動作しても、実装が異なる機能はたくさんあります。そのため、以下のような特定のプロセスや機能については、両方のプラットフォーム間でコードを再利用しないようにします。

  • アプリ ライフサイクル
  • システム タスクとコントラクト
  • タイル
  • トースト通知
  • ローカル記憶域
  • ネットワーク
  • バックグラウンド処理
  • カメラ
  • アプリ バー

アプリ ライフサイクル: Windows Phone 8 と Windows 8 のアプリ ライフサイクルはよく似ていますが、2 つのプラットフォームで使用されている API は異なります。図 3に示すように、大まかなプログラム状態や状態遷移はどちらのプラットフォームも似ていますが、Windows Phone 8 のリソースが限られていることにより、ライフサイクルに違いが生じています。どちらのプラットフォームでも、CPU リソースを使用できるのは (OS が管理するバックグラウンド タスクを除いて) フォアグラウンド アプリだけです。


図 3 Windows Phone 8 と Windows 8 のライフサイクル

図 4 に 2 つのプラットフォームのライフサイクルにおける動作の違いを示します。

図 4 Windows Phone 8 と Windows 8 のライフサイクルの相違点

Windows Phone 8 Windows 8
Windows Phone 8 アプリは必ず起動または再起動される Windows ストア アプリはページ ナビゲーションなしで再開される
Windows Phone 8 のアプリは廃棄状態になることがある Windows 8 のアプリは中断状態になるか、完全に終了するかのいずれか。Windows ストア アプリは、ホスト ビューでのアクティブ化をサポートし、システム指定の UI 内部で 1 つのタスクが実行されます。
Windows Phone 8 は高速アプリ再開をサポートする アプリはできるだけ長く断状態が維持され、維持できなければ終了するだけなので、Windows 8 は高速アプリ再開機能を必要としない

図 5 にアプリ ライフサイクルのイベントが所属する名前空間を示します。

図 5 アプリ ライフサイクルの名前空間

Windows Phone 8 Windows 8
派生元: System.Windows.Application 派生元: Windows.UI.Xaml.Application
Application_Launching  
Application_Activated OnLaunched
Application_Deactivated OnSuspending
Application_Closing  

図 6に示すように、それぞれのプラットフォームにはアプリのエントリ ポイントが複数あります。

図 6 アプリのエントリ ポイント

Windows Phone 8 Windows 8 両方
音声による起動 検索 アプリ タイル
アプリの接続 共有 セカンダリ タイル
    トースト
    プロトコルとファイルの関連付け

システム タスクとコントラクト: Windows 8 と Windows Phone 8 の両方に、OS との連携が必要になる共通操作の組み込みサポートがあります。このような共通操作は、Windows 8 ではコントラクト、Windows Phone 8 ではタスク (ランチャーやセレクターなど) を使って処理されます。コントラクトとタスクは、ユーザーにとっての機能は変わりませんが、開発が異なります。タスクとコントラクトがそれぞれ公開している機能は必ずしも 1 対 1 に対応していないため、アプリの移植時にはタスクとコントラクトを注意深く検討する必要があります。

Windows Phone 8 タスクの API には、PhotoChooserTask、EmailAddressChooseTask、SaveContractTask などがあり、いずれも Microsoft.Phone.Tasks 名前空間に属しています。一方、Windows 8 のコントラクトには、チャームによって開かれるペイン (検索ペイン、共有ペインなど) に関連する API がそれぞれ個別に存在します。コントラクトのサポートはアプリのマニフェストで宣言します。コントラクトとは基本的には合意事項のことで、コントラクトを実装するには、Application クラスのメソッドをオーバーライドし、Windows API でクラスのイベントの処理する必要があります。

タイル: タイルは Windows ストア アプリと Windows Phone 8 アプリのエントリ ポイントです。プライマリ タイルは、アプリを単純に起動します。セカンダリ タイルは、スタート画面へピン留めできます。タイルは、ユーザーをアプリ内の特定ページに移動する「ディープ リンク」にほかなりません。どちらのプラットフォームも、コンテンツを定期的に更新するライブ タイルをサポートしますが、使用する API はまったく異なります。図 7に、Windows Phone 8 タイルと Windows 8 タイルを示します。

図 7 Windows Phone 8 と Windows 8 のタイルの比較

Windows Phone 8 のタイル Windows 8 のタイル
3 つのサイズ: 小、中、大 2 つのサイズ: 小、大
標準タイル、フリップ タイル、サイクル タイル、アイコン タイル (Microsoft.Phone.Shell) セカンダリ タイルは XML テンプレートを使ってカスタマイズ可能 (Windows.UI.StartScreen)
マニフェストでタイル イメージを指定 マニフェストでタイル イメージを指定
セカンダリ タイルの作成には静的メソッド ShellTile.Create を使用 セカンダリ タイルの作成には SecondaryTile.RequestCreateAsync メソッドを使用
アプリ タイルの更新には ShellTile.Update (Microsoft.Phone.Shell)、通知のプッシュには ShellTileSchedule を使用 (ShellTileToast はタイルも更新) アプリ タイルの更新には TileUpdateManager と TileNotification (Windows.UI.Notifications) を使用
ユーザーはアプリ タイルのピン留めを解除できる ユーザーはライブ タイルをオフにできる

比較のために 図 8A図 8B にセカンダリ タイルを作成するコードを示します。Windows Phone 8 では、ShellTile クラスによってセカンダリ タイルを作成 (削除) するための静的インターフェイスが提供されます。タイルのデータをカプセル化するクラス (StandardTile、CycleTileData、FlipTileData、IconicTileData) のいずれかを使ってインターフェイスを提供します。Windows 8 にはセカンダリ タイルを定義するデータ構造が 1 つだけ存在します (SecondaryTile)。タイルの作成は非同期要求を使って行われます。タイルの作成時に、ユーザーはスタート画面にタイルをピン留めするかどうか確認されます。

図 8A Windows Phone 8 のタイル作成

<code class="csharp">CycleTileData tileData = new CycleTileData()
<code class="csharp">{
<code class="csharp">  Title = item.Title,
<code class="csharp">  SmallBackgroundImage = new Uri(item.GetImageUri(),
<code class="csharp">    UriKind.RelativeOrAbsolute),
<code class="csharp">  CycleImages = list
<code class="csharp">};
<code class="csharp">ShellTile.Create(new Uri(navDataSource,  
<code class="csharp">  UriKind.Relative), tileData, true);

図 8B Windows 8 のタイル作成

<code class="csharp">var tile = new SecondaryTile(
<code class="csharp">  item.UniqueId,      // Tile ID
<code class="csharp">  item.ShortTitle,    // Tile short name
<code class="csharp">  item.Title,         // Tile display name
<code class="csharp">  item.UniqueId,      // Activation argument
<code class="csharp">  TileOptions.ShowNameOnLogo, // Tile options
<code class="csharp">  uri                 // Tile logo URI
<code class="csharp">  );
<code class="csharp">await tile.RequestCreateAsync();

トースト通知: Windows 8 のトースト通知は、Windows Phone 8 のリマインダーやアラームに相当します。どちらの機能も、指定した時間にアプリからユーザーにイベントを通知できるようにします。トースト通知をクリックすると、閉じられているアプリは起動され、中断しているアプリは再開されます。

Windows Phone 8 では 2 種類の通知 (アラームとリマインダー) がサポートされます。また、ShellToast を使用して (バックグラウンドからでも) トーストを表示できます。アラームとリマインダーは Microsoft.Phone.Scheduler に、ShellToast は Microsoft.Phone.Shell にあります。

Windows 8 では ToastNotificationManager と ScheduledToastNotification を通じてトースト通知が使用されます。ToastNotificationManager と ScheduledToastNotification は Windows.UI.Notifications 名前空間にあり、アプリ マニフェストを使って有効にします。

ローカル記憶域: Windows.Storage 名前空間では、アプリからローカル ファイル管理を行えるようにする一連の共有 API が新たに提供されます。Windows Phone 8 では、System.IO.IsolatedStorage.IsolatedStorageFile により、Windows Phone の旧バージョンとの互換性が実現されますが、今後はこの新しい API の使用をお勧めします。シリアル化と Windows.Storage.ApplicationData.Current.LocalFolder を使用し、アプリ データをローカル アプリ記憶域に保存します。

どちらのプラットフォームでも、キーと値のペアの記憶域 (設定)、およびファイルとフォルダーがサポートされます。ただし、Windows Phone 8 の API は完全版の API のサブセットなので、ローミング データ ストア、一時データ ストア、ローカル設定、ローミング設定はサポートされません。図 9にプラットフォームごとに記憶域のオプションをまとめます。

図 9 Windows Phone 8 と Windows 8 の記憶域オプション

機能と名前空間 用途 Windows Phone 8 Windows 8
Windows.Storage ローカル アプリ ファイル記憶域
System.IO.IsolatedStorage.IsolatedStorageFile ローカル アプリ ファイル記憶域 ×
ApplicationData 設定 (LocalFolder) キーと値のペアの記憶域 ×
System.IO.IsolatedStorage.IsolatedStorageSettings キーと値のペアの記憶域 ×
SQL CE データベース ×

ネットワーク: ほとんどアプリのインターネット機能が正しく機能するかどうかは、そのアプリが実行されるデバイスのインターネット機能に大きく依存します。Windows 8 と Windows Phone 8 はどちらも、マニフェストでインターネット機能を宣言します。図 10 に関連するネットワーク API を示します。

図 10 Windows Phone 8 と Windows 8 の ネットワーク API の相違点

Windows Phone 8 Windows 8 両方

ConnectionManager

  • System.Net

NetworkInterface

  • System.Net.NetworkInformation

HttpWebRequest、HttpWebResponse

  • System.Net

DatagramSocket、StreamSocket

  • Windows.Networking.Sockets

Socket (TCP または UDP)、StreamSocket

  • System.Net.Sockets
 

HttpClient

  • System.Net.Http

WebClient

  • System.Net
 

Windows 8 では、要求をサーバーに送信するセッションとして動作する HttpClient が導入されます (HTTP、GET、POST、PUT)。HttpClient の各インスタンスは、他のインスタンスからの干渉を防ぐため、独自の接続プールを備えています。データは文字列、HttpRequestMessage、ストリーム、またはバイト配列として返されます。

それに対して、WebClient は (デスクトップ アプリを除き) Windows 8 では利用できません。WebClient は Windows Phone 8 アプリで使用され、その実装は以前のバージョンの Windows の WindowClient とは若干異なっています。Windows Phone 8 では、非同期ラッパーを指定して HttpWebRequest/HttpWebResponse を使用することもできます。ポータブル HttpClient のリリース プレビューが、両方のプラットフォームで利用できるようになります。NuGet ギャラリーからこのリリース プレビューを入手できます。

バックグラウンド処理: 音楽のストリーミング、更新のためのサーバーへの ping、ファイルのダウンロードなど、状況によってはコードをバックグラウンドで実行することがあります。どちらのプラットフォームでも、なんらかのトリガーが発生するときに、OS にタスクを実行させることができます。このようなタスクはアプリから独立していて、OS がタスクを完全に制御します。

アプリごとにバックグラウンド エージェントは 1 つしか存在できませんが、その 1 つのエージェントでは以下のタスクのいずれか、または両方実行できます。

  • 定期タスク: OS が 30 分おきに実行する短いタスク
  • リソース集中型タスク: 携帯電話が電源に接続されているときや、十分なバッテリー残量があるときに実行される長いタスク

図 11に両方のプラットフォームでバックグラウンド タスクを実行するために必要なことを示します。バックグラウンド タスクを使用する Windows ストア アプリは、アプリのマニフェストで使用を宣言する必要があります。

図 11 Windows Phone 8 と Windows 8 でのバックグラウンド タスクの使用

Windows Phone 8 Windows 8

BackgroundAgent またはそのサブクラス の 1 つから派生:

  • Microsoft.Phone 名前空間、Microsoft.Phone.Scheduler 名前空間
Windows.ApplicationModel.Background
OnInvoke メソッドをオーバーライドし、終了時に NotifyComplete を呼び出す IBackgroundTask インターフェイスとその Run メソッドを実装する
タスクがまだ登録されていないことをチェックする マニフェストでバックグラウンド タスクを宣言し、タスクがまだ登録されていないことをチェックする
バックグラウンド エージェントの追加と削除に ScheduledActionService を使用する タスクのインスタンスの作成や登録に BackgroundTaskBuilder を使用する
  BackgroundTaskCompleted イベントをハンドルし、タスクからデータを返す

ここで、バックグラウンド タスクの実装方法を示します。最初が Windows 8、次が Windows Phone 8 です。

以下は Windows 8 の大まかな手順です。

  • IBackgroundTask インターフェイスと Run メソッドを実装する
  • マニフェストでバックグラウンド タスクを使用することを宣言する
  • タスクがまだ登録されていないことをチェックする
  • BackgroundTaskBuilder を使用して、タスク インスタンスの作成と登録を行う
  • BackgroundTaskCompleted イベントをハンドルし、タスクからデータを返す
<code class="csharp">using Windows.ApplicationModel.Background;
<code class="csharp">namespace MyTaskExample
<code class="csharp">{
<code class="csharp">  public class SimpleBackgroundTask : IBackgroundTask
<code class="csharp">  {
<code class="csharp">    public void Run(IBackGroundTaskInstance task)
<code class="csharp">    {
<code class="csharp">      // Do stuff ...
<code class="csharp">    }
<code class="csharp">  }
<code class="csharp">}
  • アプリでバックグラウンド タスクを使用することを宣言する
<code class="xml">  
<code class="xml">    
<code class="xml">      
<code class="xml">    
<code class="xml">  
  • 登録をチェックする
<code class="csharp">foreach (var task in Background.BackgroundTaskRegistration.AllTasks)
<code class="csharp">{
<code class="csharp">  // Use if (task.Value.Name == taskName) to see if
<code class="csharp">  // the task has already been registered
<code class="csharp">}
<code class="csharp">// If not ...
<code class="csharp">var taskBuilder = new BackgroundTaskBuilder();
<code class="csharp">taskBuilder.Name = taskName;
<code class="csharp">taskBuilder.TaskEntryPoint = "Tasks.MyTask";
<code class="csharp">taskBuilder.SetTrigger(
<code class="csharp">  new SystemTrigger(SystemTriggerType.TimeZoneChange, false));
<code class="csharp">BackgroundTaskRegistration myTaskRegistration =
<code class="csharp">   taskBuilder.Register();

以下は Windows Phone 8 の大まかな手順です。

  • ScheduledTaskAgent を作成する (Windows Phone スケジュールされたタスク エージェント テンプレート)
<code class="csharp">public class ScheduledAgent : ScheduledTaskAgent
<code class="csharp">{
<code class="csharp">  protected override void OnInvoke(ScheduledTask task)
<code class="csharp">  {
<code class="csharp">    // Write code here to perform task ...
<code class="csharp">    NotifyComplete();
<code class="csharp">  }
<code class="csharp">}
  • タスクの実行が既にスケジュールされていることをチェックし、スケジュールが設定されていなければ新しいタスクを作成し、設定されていれば既存のタスクを削除する (以下のタスクは 10 日間周期で実行するようスケジュールを設定)。
<code class="csharp">PeriodicTask task =
<code class="csharp">     ScheduledActionService.Find(taskName) as PeriodicTask;
<code class="csharp">   bool found = (task != null);
<code class="csharp">   if (!found)            
<code class="csharp">     task = new PeriodicTask(taskName);
<code class="csharp">   else
<code class="csharp">     ScheduledActionService.Remove(taskName);
<code class="csharp">   task.Description = description;
<code class="csharp">   task.ExpirationTime = DateTime.Now.AddDays(10);
<code class="csharp">   ScheduledActionService.Add(task);

Windows 8 とは異なり、マニフェストでバックグラウンド タスクのサポートを宣言する必要はありません。

カメラ: Windows Phone 8 と Windows 8 はどちらも画像やビデオのキャプチャをサポートしますが、他の機能と同様、API が異なります。

Windows Phone 8 での写真の撮影は OS が処理するタスクです。ユーザーがカメラ UI を終了するときにタスクの結果を処理するコールバックを登録できます。結果として写真を受け取ることも、受け取れないこともあるため、結果を使用する前にチェックします。ビデオの録画はカメラの撮影タスクには組み込まれていないため、多くの作業が必要になります。

レンズというカメラ アプリを作成する機能は Windows Phone 8 固有の機能です。写真の表示や編集の固有のエクスペリエンスを提供するリッチ メディア レンズを作成することもできます。さらに、カメラを他のエクスペリエンスへのゲートウェイとして使用することができます。たとえば、バーコード リーダー アプリでカメラを使って、バーコードをスキャンし、バーコードに関連付けられるデータを表示できます。このようなレンズ アプリはすべてレンズの拡張機能の使用しています。この拡張機能により、レンズ ピッカーからビュー ファインダー エクスペリエンスを直接起動することができます。また、特殊な API を使えば、プログラムからカメラ センサーにアクセスできます。詳細については、Windows Phone Dev Center の「Windows Phone 8 のレンズ機能拡張」(https://msdn.microsoft.com/ja-jp/library/windowsphone/develop/jj662936(v=vs.105).aspx) と「Windows Phone の写真のキャプチャ」(https://msdn.microsoft.com/ja-jp/library/windowsphone/develop/jj207050(v=vs.105).aspx) を参照してください。

Windows 8 では、写真やビデオに CameraCaptureUI (Windows.Media.Capture) を使用します。そのためには、マニフェストで Web カメラとマイクを有効にする必要があります。

<code class="csharp">private async void OnCapturePhoto(object sender,
<code class="csharp">   TappedRoutedEventArgs e)
<code class="csharp">{
<code class="csharp">  var camera = new CameraCaptureUI();
<code class="csharp">  var file = 
<code class="csharp">    await camera.CaptureFileAsync(CameraCaptureUIMode.Photo);
<code class="csharp">  if (file != null)
<code class="csharp">  {
<code class="csharp">      // Do something with the result ...
<code class="csharp">  }
<code class="csharp">}

Windows Phone 8 で写真を撮影する場合 CameraCaptureTask (Microsoft.Phone.Tasks) が使用されます。これには図 12に示すように、マニフェストで ID_CAP_ISV_CAMERA と ID_CAP_MICROPHONE を有効にする必要があります。

図 12 Windows Phone 8 マニフェストでの ID_CAP_ISV_CAMERA と ID_CAP_MICROPHONE の有効化

<code class="csharp">private readonly CameraCaptureTask cameraTask;
<code class="csharp">public Init() {
<code class="csharp">  cameraTask = new CameraCaptureTask();
<code class="csharp">  cameraTask.Completed += PhotoCaptured;
<code class="csharp">}
<code class="csharp">public void TakePhoto() {
<code class="csharp">  cameraTask.Show();
<code class="csharp">}
<code class="csharp">private async void PhotoCaptured (object sender,
<code class="csharp">   PhotoResult result) {
<code class="csharp">  await Task.Run(() =&gt; {
<code class="csharp">    // Do something with the result...
<code class="csharp">  });
<code class="csharp">}

アプリ バー: Windows 8 のアプリ バーには、Windows Phone 8 アプリ バーに比べて多くの機能があります。項目の追加、編集、削除など、よく使われる操作をアプリ バーに配置できます。ユーザーがアプリ バーを開いたり、閉じたりするときに発生する、Opened イベントや Closed イベントをハンドルすることによって、アプリに通知できます。

図 13に示すように、プラットフォームごとにアプリ バーのしくみに大きな違いがあります。

図 13 Windows Phone 8 と Windows 8 のアプリ バーのしくみの相違点

Windows Phone 8 Windows 8
ページ下部に 1 つのアプリ バー ページの下部と上部にそれぞれ 1 つのアプリ バー

4 項目のみ許可

  • 追加項目はメニューに配置する
  • グループ化できない

どのコンテナーでも同様の動作

  • メニューなし
  • 入れ子になったコンテナーに項目をグループ化できる
PhoneApplicationPage.ApplicationBar 内部に ApplicationBar コントロール Page.BottomAppBar または Page.TopAppBar 内部に AppBar コントロール
ページ読み込み時にアプリ バーを表示するには、Mode に Dafault を設定する ページ読み込み時にアプリ バーを表示するには、IsOpen を true に設定する
メニューを有効にするには IsMenuEnabled を設定する アプリ バーを強制的に常に開いたままにするには IsSticky を true に設定する

Windows 8 のアプリ バー宣言を図 14に示します。ボタンを左側の 1 つのグループと右側のもう 1 つのグループにグループ化するために、2 つのスタック パネルを使用しています。

図 14 Windows 8 のアプリ バー宣言

<code class="xml">  
<code class="xml">    
<code class="xml">      
<code class="xml">        
<code class="xml">        
<code class="xml">      
<code class="xml">      
<code class="xml">        
<code class="xml">        
<code class="xml">      
<code class="xml">    
<code class="xml">  

図 15 に Windows Phone 8 のアプリ バー宣言を示します (4 つの ApplicationBarIconButton 要素だけが phone の ApplicationBar で許可され、ApplicationBar 要素内にはコンテナーが配置されません)。

図 15 Windows Phone 8 のアプリ バー宣言

<code class="xml">  
<code class="xml">    
<code class="xml">    
<code class="xml">    
<code class="xml">    
<code class="xml">  

まとめ

消費者は、徐々に、スマートフォンと他のデバイスに同じエクスペリエンスを求めるようになっています。Windows 8 と Windows Phone 8 のコアは共通なので、両方のプラットフォームを対象にするソリューションをビルドするときに、ある程度再利用が可能です。ただし、今回説明したように、物理デバイスの違いや、ユーザーが物理デバイスを操作する方法の違いだけでなく、それぞれの API の相違点を認識しておくことが重要です。これらの相違点により、アプリの設計者は UI や UX のビルドを個別に構成する必要があり、同様に両方のプラットフォームで同じ XAML の再利用することほとんどできなくなります。Windows.Store.StorageFile のように、両方のプラットフォームで利用できる API もありますが、一見よく似ている機能であっても、実装が異なります。たとえば、ライフサイクル イベント、タイル、メディア キャプチャー、タスクとコントラクト、設定、バックグラウンド タスク、アプリ バーなどがこれに当てはまります。

これらの相違点を把握すれば、移植可能なクラス ライブラリ、ランタイム コンポーネントなどのクロス プラットフォーム コード再利用技法を自信をもって利用することができるようになります。これらの技法の詳細については、前述の Doug Holland のコード共有に関する記事や Windows Phone Dev Center の記事 (https://msdn.microsoft.com/ja-jp/library/windowsphone/develop/jj714089(v=vs.105).aspx) を参照してください。また、実際のコード共有を紹介するサンプル コードを aka.ms/gxcvq3(英語) からダウンロードすることをお勧めします。

Joel Reyes は、Windows Phone 8 と Windows 8 に重点を置く DPE パブリック セクターのテクノロジ エバンジェリストです。彼の連絡先は joel.reyes@microsoft.com(英語のみ) です。

この記事のレビューに協力してくれた技術スタッフの Andrew Byrne (マイクロソフト) と Matthias Shapiro (マイクロソフト) に心より感謝いたします。