2014年10月14日 星期二

建立及更新 Live Tile 動態磚資訊

在上一篇筆記 基礎 Secondary Tiles 新增及操作 記錄了如何釘上基本的動態磚來做內容的入口時有提到,使用 NotificationsExtensions 可以比較方便的達到花樣更豐富的動態磚。

NotificationsExtensions 本身是一個 Protable Classes Library 所開發的 Library,所以對於 Windows Phone 及 Windows Store 的支援性是一樣的,裡面大部份的 Function 在做的事是將傳入的圖片,字串等參數組成一段 XML 來建立或更新動態磚。

NotificationsExtensions 的官方文件中可以下載到包含 Source Code 的範例專案,打開專案中 TileContent.cs 這個檔案的最底部可以發現 TileContentFactory 是一個使用 Static Factory Pattern 開發的類別,其中有很多像 CreateTileSquare150x150Block 這樣子的靜態 Method,這些都是用來產生各式外型 Live Tile 的 Method,可以參考 The tile template catalog

在使用 NotificationsExtensions 更新 Live Tile 之前,首先當然要有已經釘到桌面上的 Tile,而查詢 Tile 是否已被釘上,可以使用列舉的方式,也可以直接使用 TileId 來查詢,方法如下

// 使用 foreach 從 tilelist 中找到已釘至桌面的合適 Tile
IReadOnlyList<SecondaryTile> tilelist = await Windows.UI.StartScreen.SecondaryTile.FindAllAsync();

// 或直接查詢要 Update 的 Tile 是否存在
SecondaryTile.Exists(Constants.TILE_ID)

而之所以要介紹這個 Library,利用以下兩種方式來更新 Tile 就可以明顯看出好處了

const String TILE_ID = "tile_id";

// 使用 NotificationsExtensions 更新動態磚
if (SecondaryTile.Exists(TILE_ID))
{
    // 更新文字
    ITileWide310x150Text04 tileContent = TileContentFactory.CreateTileWide310x150Text04();
    tileContent.TextBodyWrap.Text = "Sent to a secondary tile from NotificationsExtensions!";

    ITileSquare150x150Text04 squareContent = TileContentFactory.CreateTileSquare150x150Text04();
    squareContent.TextBodyWrap.Text = "Sent to a secondary tile from NotificationExtensions!";
    tileContent.Square150x150Content = squareContent;

    TileUpdateManager.CreateTileUpdaterForSecondaryTile(TILE_ID).Update(tileContent.CreateNotification());

    // 更新數字
    BadgeNumericNotificationContent badgeContent = new BadgeNumericNotificationContent(6);
    BadgeUpdateManager.CreateBadgeUpdaterForSecondaryTile(TILE_ID).Update(badgeContent.CreateNotification());
}

// 自行描述更新資訊
if (SecondaryTile.Exists(TILE_ID))
{
    // 更新文字
    string tileXmlString = "<tile>"
                         + "<visual version='2'>"
                         + "<binding template='TileWide310x150Text04' fallback='TileWideText04'>"
                         + "<text id='1'>Send to a secondary tile from strings</text>"
                         + "</binding>"
                         + "<binding template='TileSquare150x150Text04' fallback='TileSquareText04'>"
                         + "<text id='1'>Send to a secondary tile from strings</text>"
                         + "</binding>"
                         + "</visual>"
                         + "</tile>";

    XmlDocument tileDOM = new XmlDocument();
    tileDOM.LoadXml(tileXmlString);
    TileNotification tile = new TileNotification(tileDOM);
    TileUpdateManager.CreateTileUpdaterForSecondaryTile(TILE_ID).Update(tile);

    // 更新數字
    string badgeXmlString = "<badge value='9'/>";
    XmlDocument badgeDOM = new XmlDocument();
    badgeDOM.LoadXml(badgeXmlString);
    BadgeNotification badge = new BadgeNotification(badgeDOM);
    BadgeUpdateManager.CreateBadgeUpdaterForSecondaryTile(TILE_ID).Update(badge);

}


沒有留言:

張貼留言