これまでに開発してきたWindowsランタイムアプリをWindows 10対応させるにはどうすればよいか。本稿では、コードを使ってチャームやアプリバーを開く方法を解説する。
powered by Insider.NET
Windows 8.1向けに開発したWindowsランタイムアプリをWindows 10にインストールすると、アプリバーと各種のチャームを開く操作がやりにくくなる。せめて画面に追加したボタンなどからアプリバーやチャームをワンタッチで開けないだろうか? 本稿では、各種チャームとアプリバーをコードから開く方法を紹介する。なお、本稿のサンプルは「Windows Store app samples:MetroTips #102」からダウンロードできる。
ユニバーサルプロジェクトを使ってユニバーサルWindowsアプリを開発するには、以下の開発環境が必要である。本稿では、無償のVisual Studio Community 2013 with Update 4を使っている。
*1 SLAT対応ハードウエアは、Windows Phone 8.1エミュレーターの実行に必要だ。ただし未対応でも、ソースコードのビルドと実機でのデバッグは可能だ。SLAT対応のチェック方法はMSDNブログの「Windows Phone SDK 8.0 ダウンロードポイント と Second Level Address Translation (SLAT) 対応PCかどうかを判定する方法」を参照。なお、SLAT対応ハードウエアであっても、VM上ではエミュレーターが動作しないことがあるのでご注意願いたい。
*2 事前には「Windows 8.1 Update 1」と呼ばれていたアップデート。スタート画面の右上に検索ボタンが(環境によっては電源ボタンも)表示されるようになるので、適用済みかどうかは簡単に見分けられる。ちなみに公式呼称は「the Windows RT 8.1, Windows 8.1, and Windows Server 2012 R2 update that is dated April, 2014」というようである。
*3 Windows Phone 8.1エミュレーターを使用しないのであれば、32bit版のWindows 8.1でもよい。
*4 マイクロソフトのダウンロードページから誰でも入手できる(このURLはUpdate 4のもの)。
*5 本稿に掲載したコードを試すだけなら、無償のExpressエディションやCommunityエディションで構わない。Visual Studio Express 2013 with Update 4 for Windows(製品版)はマイクロソフトのページから無償で入手できる。Expressエディションはターゲットプラットフォームごとに製品が分かれていて紛らわしいが、Windowsランタイムアプリの開発には「for Windows」を使う(「for Windows Desktop」はデスクトップで動作するアプリ用)。また、2014年11月12日(米国時間)に新しくリリースされたVisual Studio Community 2013 with Update 4(製品版)もマイクロソフトのページから無償で入手できる。Communityエディションは本稿執筆時点では英語版だけなので、同じ場所にあるVisual Studio 2013 Language Packの日本語版を追加インストールし、[オプション]ダイアログで言語を切り替える必要がある。
本稿では、紛らわしくない限り次の略称を用いる。
Visual Studio 2013 Update 2(Update 3/4も)では、残念なことにVB用のユニバーサルプロジェクトのテンプレートは含まれていない*6。そのため、本稿で紹介するコードはC#のユニバーサルプロジェクトだけとさせていただく。
*6 VB用のユニバーサルプロジェクトは、2015年にリリースされるといわれているVisual Studio 2015(開発コード「Visual Studio 14」)からの提供となるようだ。「Visual Studio UserVoice」(英語)のリクエストに対する、2014年6月18日付けの「Visual Studio team (Product Team, Microsoft)」からの回答による。
Windows 8.1向けに開発したWindowsランタイムアプリでは、画面の上端/下端からのスワイプ(マウス操作では右クリック)で表示されるアプリバー(Windows.UI.Xaml.Controls名前空間のAppBarコントロール)や、右端からのスワイプ(マウス操作では右上隅/右下隅をポイント)で表示されるチャームを利用していることも多いだろう。ところが、2015年の夏に提供開始される予定のWindows 10にそのようなアプリをインストールすると、タッチでの操作が少々やりにくくなるのだ(次の画像)。
上の画像で示したハンバーガーメニューには、次の5個のメニューがある。
これらのうち、[印刷]メニューだけは、アプリが印刷に対応しているときだけ利用可能になる。他の4個のメニューは、Windows 8.1向けに開発したWindowsランタイムアプリであれば必ず利用可能状態で表示されるようである。
ちなみに、これらの機能をWindows 10向けのアプリではどのように実装しているかというと、マイクロソフト製のいくつかのアプリを見てみたところではだいたい次のようにしているようだ。
例えば、次の画像はWindows 10向けの新しい「ストア」アプリである。設定画面に遷移するためのボタンと、共有チャームを開くためのリンクが見える。
なお、Windows Phone 8.1にはチャームがなく、アプリバーはスワイプではなくタッチ操作で開けられるようになっている。そのため、Windows Phone 8.1向けのアプリをモバイル向けのWindows 10にインストールした場合は、上で紹介したような問題は生じない。
このようなUIの変化に対応するベストな方法は、言うまでもなくWindows 10向けに新しくアプリを開発することだ。しかし、そうしない場合には、既存のWindows 8.1向けアプリにチャームなどを開くためのUIを追加して、タッチ操作をしやすくすることが考えられる。
ここでは、Windows 8.1/Windows Phone 8.1向けのユニバーサルWindowsアプリに、チャームなどを開くためのボタンを設置する方法を紹介しよう。ユニバーサルプロジェクトを使い、WindowsとPhoneで部分的にUIを共有するためユーザーコントロール(Windows.UI.Xaml.Controls名前空間のUserControlクラス)を継承したクラスを共有プロジェクトに作成し、そこに5個のボタンを配置する(次の画像)。
配置した5個のボタンは、ハンバーガーメニューの5個のメニューに対応する。Phoneで利用できない機能は、画面表示時に隠すか無効化しておこう。ここでは無効にしておく(次のコード)。
public MyUserControl()
{
this.InitializeComponent();
#if WINDOWS_PHONE_APP
// Phoneでは利用できないボタン
this.FindButton.IsEnabled = false; //[検索]ボタン
this.PageButton.IsEnabled = false; //[印刷]ボタン
#endif
}
以降、それぞれのボタンのClickイベントハンドラーにどのようなコードを記述するかを紹介していく。なお、共有や印刷を実行するコードは、すでに記述してあるものとする(別途公開のサンプルには、チャームを開くためだけの最小限度の実装が記述してある)。また、それぞれのコードの実行結果は、記事の最後にまとめて掲載する。
現在表示されている画面のAppBarコントロールを取得し、そのIsOpenプロパティにtrueをセットすればよい(次のコード)。これはWindowsとPhoneで共通である。
// [アプリ コマンド]ボタン
private void MoreButtonClick(object sender, RoutedEventArgs e)
{
// 現在表示されている画面のAppBarコントロールを取得する
var frame = Window.Current.Content as Frame;
var page = frame.Content as Page;
var appBar = page.BottomAppBar;
// アプリバーを開く
if (appBar != null)
appBar.IsOpen = true;
}
WindowsではSearchPaneクラス(Windows.ApplicationModel.Search名前空間)を使えばよい(次のコード)。なお、検索チャームはWindows 8.0向けアプリとの互換のための機能であり、Windows 8.1向けアプリ用の検索ボックス(Windows.UI.Xaml.Controls名前空間のSearchBoxコントロール)とは共存できない。
// [検索]ボタン
private void FindButtonClick(object sender, RoutedEventArgs e)
{
#if WINDOWS_APP
Windows.ApplicationModel.Search.SearchPane.GetForCurrentView().Show();
#endif
}
DataTransferManagerクラス(Windows.ApplicationModel.DataTransfer名前空間)を使えばよい(次のコード)。これはWindowsとPhoneで共通である。
// [共有]ボタン
private void ShareButtonClick(object sender, RoutedEventArgs e)
{
Windows.ApplicationModel.DataTransfer.DataTransferManager.ShowShareUI();
}
WindowsではPrintManagerクラス(Windows.Graphics.Printing名前空間)を使えばよい(次のコード)。そのShowPrintUIAsyncメソッドでWindows 8.1では印刷チャーム(プリンターを選択する状態)が出たが、Windows10ではいきなり印刷プレビューダイアログが開く。
// [印刷]ボタン
private
#if WINDOWS_APP
async
#endif
void PageButtonClick(object sender, RoutedEventArgs e)
{
#if WINDOWS_APP
await Windows.Graphics.Printing.PrintManager.ShowPrintUIAsync();
#endif
}
WindowsではSettingsPaneクラス(Windows.UI.ApplicationSettings名前空間)を使えばよい(次のコード)。PhoneにはSettingsPaneクラスはないが、独自の設定画面を実装することも多いだろう。このコードはそのような想定をしている。
// [設定]ボタン
private void SettingButtonClick(object sender, RoutedEventArgs e)
{
#if WINDOWS_APP
Windows.UI.ApplicationSettings.SettingsPane.Show();
#endif
#if WINDOWS_PHONE_APP
// Phoneでは、設定画面へ遷移させる
var frame = Window.Current.Content as Frame;
frame.Navigate(typeof(SettingsPage));
#endif
}
以上で説明したユーザーコントロールを、WindowsとPhoneの画面に配置してアプリを作成する(それぞれの画面には、アプリバーや印刷などに必要となる機能も実装する)。それを実行すると、次からの画像に示すようになる(実際のコードは別途公開のサンプルをご覧いただきたい)。
なお、左端の画面ではハンバーガーメニューを出している。前述したように、Windows 8.1向けのアプリには自動的にハンバーガーボタンが付くのである。
Windows 8.1向けのWindowsランタイムアプリでアプリバーやチャームを利用している場合は、Windows 10で操作性が低下してしまうことへの対策を講じた方がよい。本稿では、アプリバーやチャームを開くためのUIを画面に追加する方法を紹介した。
Copyright© Digital Advantage Corp. All Rights Reserved.