第10章で述べたとおり、スタート画面に表示できるアプリのタイルには4種類のサイズがあり、小サイズのタイル以外はライブタイルとして用いることができました。
おさらいになりますが、以下はライブタイルを更新するコードの例です。
1 2 3 4 5 6 7 8 9 10 11 |
XmlDocument document = TileUpdateManager.GetTemplateContent(TileTemplateType.TileWide310x150Text01); document .GetElementsByTagName("text")[0] .AppendChild(document.CreateTextNode("はじめまして")); // ライブタイルを更新 TileUpdateManager .CreateTileUpdaterForApplication() .Update(new TileNotification(document)); |
ここではTileWide310x150Text01というテンプレートを用いて、横長のライブタイルの情報を更新しています。
ここで、このライブタイルのサイズを中および大のサイズに変更してみると確認できますが、中および大サイズのタイルには、アプリのアイコンが表示されるのみです。使用したテンプレートは、横長のタイル用のものなので、横長のタイルのみ表示情報が更新された形なっているのです。
もちろん、ここで違うテンプレート、例えばTileSquare150x150Text01(中サイズ)やTlieSquare310x310Text01(大サイズ)を用いると、それぞれのサイズのタイルに表示されている情報を更新できます。しかし、それ以外のサイズのタイルはやはり変更されません。すべてのサイズのタイルに表示されている情報を同時に変更するにはどうすればよいのでしょうか。
ここで、テンプレートの仕組みについてもう少しく詳しく見てみましょう。書籍でも触れましたが、テンプレートの実体はXmlDocument形式のオブジェクト、すなわちXMLです。例えば、TileWide310x150Text01のテンプレートを等価なXMLとして表現すると以下のようなものになります。
1 2 3 4 5 6 7 |
<tile> <visual version="2"> <binding fallback="TileSquareText01" template="TileSquare150x150Text01"> <text id="1">こんにちは</text> </binding> </visual> </tile> |
bindingタグおよぼその子要素に注目していください。bindingの子要素であるtextタグが実際の更新情報を表しており、bindingタグのtemplate属性がどのテンプレート(レイアウト)を用いるか指定しています。ここでピンと来た方もいるかもしれませんが、bindingは複数指定することができるのです。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<tile> <visual version="2"> <binding fallback="TileSquareText01" template="TileSquare150x150Text01"> <text id="1">こんにちは</text> </binding> <binding template="TileSquare310x310Text01"> <text id="1">こんにちは</text> </binding> <binding template="TileWide310x150Text01"> <text id="1">こんにちは</text> </binding> </visual> </tile> |
この例では以下の3種類のテンプレートを用い、中、大、横長サイズのそれぞれのライブタイルに対する更新情報を指定しています。
- TileSquare150x150Text01
- TlieSquare310x310Text01
- TileWide310x150Text01
このXMLを用いてTileUpdateManagerのUpdateを呼び出すと、ワイド以外の2種類のサイズのライブタイルにおいても表示される情報が更新されるようになります。
コーディング上、少し面倒なのがこのXMLを表すXmlDocumentのオブジェクトをどのように準備するのか、という点です。この場合、TileUpdateManagerのGetTemplateContentメソッドは使えないので、XmlDocumentに用意されているDOM(Document Object Model)操作のメソッドを利用して、XmlDocumentのオブジェクトをいちから生成するのが正攻法になります。
ただし、これは実際にやってみるとわかりますが、大変煩雑かつ面倒なコーディングになります。そこでここでは、System.Xml.Linqに用意されているXDocumentを用いる方法を紹介しておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
// 更新情報として表示するテキスト string text = TileText.Text; // 更新情報 var content = new XDocument( new XElement( "tile", new XElement( "visual", new XAttribute("version", "2"), new XElement( "binding", new XAttribute("template", "TileSquare150x150Text01"), new XAttribute("fallback", "TileSquareText01"), new XElement("text", new XAttribute("id", "1"), new XText(text))), new XElement( "binding", new XAttribute("template", "TileSquare310x310Text01"), new XElement("text", new XAttribute("id", "1"), new XText(text))), new XElement( "binding", new XAttribute("template", "TileWide310x150Text01"), new XElement("text", new XAttribute("id", "1"), new XText(text)))))); // XDocument → XmlDocument var document = new XmlDocument(); document.LoadXml(content.ToString(SaveOptions.DisableFormatting)); // ライブタイルを更新 TileUpdateManager .CreateTileUpdaterForApplication() .Update(new TileNotification(document)); |
XDocumentもXmlDocumentと同じく、XMLをオブジェクトとして操作するためのものです。LINQ to XMLでの利用を想定して新たにデザインされており、XmlDocumentと比較して使い勝手がかなり改善されています。ここでは、この使いやすいXDocumentを使用してXMLのオブジェクトを構築し、それをXmlDocumentに変換するというアプローチを用いました。メモリ消費およびパフォーマンスという観点からは必ずしもベストなやり方ではないのですが、ここでは、コードの理解しやすさという観点からこの方法を紹介しています。
NOTE: この方法を用いたとしても以下のような条件下であれば特に問題にならないかもしれません。
- ライブタイルの更新頻度がそれほど頻繁でない
- 構築するXMLのサイズがそれほど極端に大きくはない
実際に使用される場合は十分にテストしてみてください。
サンプルコードはgithubから入手可能です。