雑記 - otherwise

最近はDQ10しかやっていないダメ技術者がちまちまと綴る雑記帳

UWP アプリで Windows 10 Mobile のステータスバーの表示をカスタマイズする

またもや随分とご無沙汰になってしまいました。
実際、前回の記事を見たら 2014/12/10 とかになっていて、 2 年も書いていなかったという事に自分自身でも驚いているところです。(まぁ、その間に自社 blog に記事を書いたりもしていたので。。。)
……まぁ、それはさておき、今年も Advent Calendar の季節になりました。
『去年は仕事が忙しすぎたり外部ネットワークから遮断された環境にいたりで参加を見送らざるを得なかったので、今年はちゃんと Advent Calendar に復帰するぞ!』と意気込んで比較的早めに手を挙げていたものの、ちょうど直前にまた自社の blog 記事担当がまわってきたりして、こっちのネタを練る時間がちっとも取れないまま当日を迎えるという体たらくです。ゴメンナサイ。(デモ一応 5 日ノウチニ載セマシタヨ><)
と云う事で、 Windows 10 Mobile / Windows Phone Advent Calendar 2016 5 日目です。
Windows Phone 8.1 の頃、システムトレイのカスタマイズ方法についての記事を書いていましたが、最近、当時作っていたアプリを UWP に移植しようとした際に若干手間取ったので、今回は備忘録がてらに記事にしておこうと思います。

Windows Mobile Extension for UWP

UWP (Universal Windows Platform) アプリケーションでデバイスファミリー*1固有の機能を使う場合、「各デバイスファミリー向けの Extension SDK をインポート」する必要があります。

※今回は Mobile 固有の機能 (StatusBar) を使用するため、 Mobile Extension をインポートします。

StatusBar クラス

実のところ、 UWP では Windows Phone 8.1 (UAP) と同じ構成の StatusBar クラスが用意されています。
使い方も UAP のものと一緒です。 :p

StatusBar クラスの呼び出し方

但し、 UAP 時代と違うところが一つあります。
UAP では「 Windows Phone アプリコードからのみ呼び出す((Windows Phone プロジェクト内に記載する or ifdef プリプロセッサを利用 (Shared)))」様にしていましたが、 UWP では Contract ベースになっているため、クラス利用の前に存在チェックが必要になっています。

if (Windows.Foundation.Metadata.ApiInformation.IsTypePresent("Windows.UI.ViewManagement.StatusBar"))
{
  var statusBar = Windows.UI.ViewManagement.StatusBar.GetForCurrentView();
  ...
}

なお、 StatusBar を利用出来ない( Mobile 以外のデバイスファミリー)環境で Windows.UI.ViewManagement.StatusBar へのアクセスを行うとエラーが発生します。

(例)プログレスインジケータ (Indeterminate) を表示

if (Windows.Foundation.Metadata.ApiInformation.IsTypePresent("Windows.UI.ViewManagement.StatusBar"))
{
  var statusBar = Windows.UI.ViewManagement.StatusBar.GetForCurrentView();
  statusBar.BackgroundColor = Windows.UI.Colors.Brown;
  statusBar.ForegroundColor = Windows.UI.Colors.YellowGreen;
  statusBar.BackgroundOpacity = 0.85;
  var progress = statusBar.ProgressIndicator;
  progress.ProgressValue = null;
  await progress.ShowAsync();
}

*1:Desktop, Mobile, IoT, Holographic, etc..