kazuakix の日記

Windows Phone とか好きです

Windows Phone のタイルをスマートに更新する

先日 タイル更新の記事をアップしたとき @biac さんから NotificationsExtensions なるものを教えて頂きました。

確かに、昨日までのコードは画像やテキストによって値のセット方法が違っていたりしてあまりスマートなものではありませんでした。

var tileXml = TileUpdateManager.GetTemplateContent(
    TileTemplateType.TileSquare150x150PeekImageAndText01);

// 画像
var imageElement = tileXml.GetElementsByTagName("image").Single();
imageElement.Attributes.GetNamedItem("src").NodeValue = "ms-appx:///Assets/od_tile.png";

// テキスト
tileXml.GetElementsByTagName("text")[0].InnerText = "100MB";

var updater = TileUpdateManager.CreateTileUpdaterForApplication();
updater.Update(new TileNotification(tileXml));

NotificationsExtensions を利用してコードを見やすく直していきましょう。
 

NotificationsExtensions を使う

導入

教えて頂いたページを参考に NotificationsExtensions を導入します。いつもなら NuGet から取ってくるのですが なぜか登録されていないので、コードサンプルからダウンロードします。

ダウンロードしたサンプルソリューションのうち、NotificationsExtensions フォルダを自分のプロジェクトにコピーしてソリューションに NotificationsExtensions.csprj を追加しましょう。

f:id:kazuakix:20141008235419j:plain

後は Windows Phone プロジェクトの参照設定に NotificationsExtensions プロジェクトを追加するだけで使えるようになります。
(追記) 普通に NuGet から導入できました。

 

使ってみる

今まで TileUpdateManager.GetTemplateContent でテンプレートの XML を作っていた部分を NotificationsExtensions.TileContent.TileContentFactory に置き換えます。

あとはメンバに値をセットしていって、最後に CreateNotification したものを TileUpdateManager に渡してやるだけ。

var tile = NotificationsExtensions.TileContent
  .TileContentFactory.CreateTileSquare150x150PeekImageAndText01();

// 画像
tile.Image.Src = "ms-appx:///Assets/od_tile.png";
// テキスト
tile.TextBody1.Text = "1000MB";

var updater = TileUpdateManager.CreateTileUpdaterForApplication();
updater.Update(tile.CreateNotification());

かなりスッキリしたコードになりましたね。
 
実行すると、こんな感じでちゃんと動作しています。

f:id:kazuakix:20141008235426j:plain,w240