Windows 8 アプリの Windows 8.1 へのマイグレーションについて

Windows 8 のストア アプリのプロジェクトを Windows 8.1 用のプロジェクトへ移行する方法は、物江さんのBlogにまとまっていますので、私の方は変更された API に焦点を絞って解説します。Visual Studio 2013を使ってプロジェクトの再ターゲットを行うと、マイグレーションガイドのドキュメントのダイアログが表示されます。このドキュメントは、デベロッパーセンターでも公開されていて、このドキュメントが変更されたAPIのガイドにもなっています。残念ながら英語ドキュメントのままなので、再ターゲットを行われる場合は、一度は必ず目を通すようにしてください。プロジェクトを再ターゲットした後に行うべき作業は、大きくは3種類があります。

  • 変更されたAPIに対する対応
  • 新しいウィンドウ化モードへの対応(320ピクセルのスナップビューの廃止)
  • 追加されたAPIやコントロールに対する対応の検討と実施

変更されたAPIに対応する作業において、XAML/C#、VB、C++ではVisual Studio 2013での支援機能があります。具体的には、ビルドすると変更されたAPIに対してワーニングを出力してくれます。Visual Studio 2013 RCで私が確認している限りは、完璧ではないようですが、かなりの作業で有効に機能しています。一方で、HTML/JavaScriptの場合は、このような支援機能がないのでマイグレーションガイドのドキュメントと照らし合わせて、作業を実施する必要があります。WinJSで、廃止予定のAPIを以下に記載します。

SettingsFlyout.width 新しいウィンドウ化モードに合わせて変更します
ListLayout.backdropColor .win-backdrop {background-color:transparent;}へ置き換え
ListLayout.disableBackdrop .win-backdrop {background-color:transparent;}へ置き換え
GridLayout.backdropColor .win-backdrop {background-color: <color>;}へ置き換え
GridLayout.disableBackdrop .win-backdrop {background-color:transparent;}へ置き換え
GridLayout.maxRows .win-surface {height: 200px;}のようにheightを使用します。
GridLayout.groupInfo CellspanningLayout.groupInfo へ置き換え
GridLayout.itemInfo CellspanningLayout.itemInfoへ置き換え
ListView.loadingBehavior デザインに応じて対応します
ListView.automaticallyLoadPages デザインに応じて対応します
ListView.loadMorePages デザインに応じて対応します
ListView.pagesToLoad デザインに応じて対応します
ListView.pagesToLoadThreshold デザインに応じて対応します

 

Windows Runtimeで大きく変更になったのが、ApplicationViewクラスとDisplayPropertiesクラスになります。基本的な考え方は、それぞれのクラスは静的メンバーを提供していますが、Windows 8.1からインスタンス メンバーを提供するようになっています。このために、GetForCurrentView静的メソッドによってインスタンスを取得してから、メンバーへアクセスする形式となります。また、DisplayPropertiesクラスは廃止となりDisplayInformationクラスが同等の機能を提供します。これ以外に、よく使われるものとしてはMediaControlがSystemMediaTransportControlsへ置き換えとなっています。全てではありませんが、良く使うと思われるAPIの変更箇所を次に示します。

API名 説明
ApplicationView GetForCurrentViewメソッドでインスタンスを取得して、メンバーへアクセス Valueプロパティ、TryUnsnapメソッドの廃止 Orientation、IsFullFullScreenプロパティを利用します。
DisplayProperties DispalkyInformationクラスへ置き換え。 GetForCurrentViewメソッドでインスタンスを取得して、メンバーへアクセス
MediaControl SystemMediaTransportControlsへ置き換え。
Geocoordinate.Latitude Geocoordinate.Longitude Pointプロパティを使ってGeopointを取得して、Positionプロパティを使って アクセスします。

もちろん、これ以外にも変更されたAPIはあります。詳細を知りたい場合は、マイグレーションガイドのドキュメントを参照するようにして下さい。