kazuakix の日記

Windows Phone とか好きです

Windows Phone 8.1 でタイルを更新する

Windows Phone 7 の頃はタイトルとカウンタの値程度しか指定できなかったタイルですが、Phone 8 からテンプレートを指定することでいろいろなタイルを作ることができるようになっています。


タイルを指定するときは TileUpdateManager.GetTemplateContent でタイルのテンプレートを取得します。
例えば TileSquare150x150Text01 というテンプレートだとこんな感じ。

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

ちなみに テンプレートにはバージョン 1 とバージョン 2 の 2 種類がありますが、WP8.1 の場合はバージョン 2 を選びます。

こうして取得したテンプレートは XML なので中身をガリガリと書き換えていきます。

tileXml.GetElementsByTagName("text")[0].InnerText = "test"; 

(このあたりあまりスマートではないような気がしますが...)

この例では最初の text タグのテキストを設定しています。どんな項目を設定できるのかは上記ページを見ると XML の例として紹介されています。

f:id:kazuakix:20141007001247j:plain,w500

最後に TileUpdater にこの XML から作った TileNotification を渡してやることでタイルを更新することができます。

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

実際に使ってみる

これを昨日までのバックグラウンド タスクに組み込んでみました。

public async void Run(IBackgroundTaskInstance taskInstance)
{
    // 遅延を要求
    var deferral = taskInstance.GetDeferral();

    // 空き容量取得
    var api    = new MioCouponAPI();
    var volume = await api.GetCouponVolume();

    // タイル更新
    var tileXml = TileUpdateManager.GetTemplateContent(
        TileTemplateType.TileSquare150x150Text01);
    tileXml.GetElementsByTagName("text")[0].InnerText 
        = string.Format("{0:#,0} MB", volume);            

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

    // 遅延の完了
    deferral.Complete(); 
}

 
こんな感じで更新されるようになりました。

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

なんだかそれっぽくなってきましたね。