首先我們來瞭解下在Win8中的通知種類:可參考MSDN關於磁貼、鎖屏、Toast和次要磚的概述
1、Tile通知:也就是程式安裝後在首頁的一個表徵圖(寬的(310X150)和方的(150X150)),然而我們可以在後台給他發送一些通知訊息在上面顯示。
2、徽章:a、第一種是在Tile的右下角顯示數字(0-99)和字形(系統自己定義的)
b、第二種是在電腦螢幕上的徽章
3、次要磚通知:次要磚就是使用者可以將應用中的特定內容或體驗固定到“開始”螢幕,以便能直接存取該內容或體驗。比如QQ可以固定一個常用列表在案頭,以後就可以直接點擊進入聊天模式了。
4、Toast通知:這是一個在螢幕右上方發出來的通知。
接著我們還要瞭解下發送通知的種類:可參考MSDN選擇通知傳遞方法
1、本地通知
2、計劃通知
3、定期通知
4、推播通知
今天主要探討下Tile的本地通知:
一、如何設定預設的Tile
我們可以開啟項目的package.appxmanifest檔案,在這個檔案下我們可以設定
Note:
第一個顯示名稱:他會在系統卸載的時候那個提示框中顯示(或許還有其他地方,我還沒有發現)
第二個顯示名稱是配合他上面的簡短名稱來指定在什麼徽標顯示。(例如但我們在顯示名稱指定了僅標準徽標,那個我們的寬徽標的左下角就不會顯示簡短名稱)
徽標必須設定,寬徽標和小徽標可選,寬徽標如果沒有設定則我們在首頁的app欄不會出現放大按鈕,小徽標會在我們發送通知的時候顯示在左下角(一開始安裝程式不會顯示,我也不知道為什麼或許我看錯了)
二、給Tile發送本地通知
1、使用XMLDocument來實現
//發送本地磁貼更新 private void Button_Click_1(object sender, RoutedEventArgs e) { //獲得指定模板圖塊的XML XmlDocument tileXml = TileUpdateManager.GetTemplateContent(TileTemplateType.TileWideImageAndText01); tbXml.Text = tileXml.GetXml();//可以查看每個模板的不同XML //給XML節點設定文本 XmlNodeList textNode = tileXml.GetElementsByTagName("text"); textNode[0].InnerText = "這是我建立的一個Tile,他包括一個映像和一個最多兩行的文本"; //添加映像 XmlNodeList imageNode = tileXml.GetElementsByTagName("image"); ((XmlElement)imageNode[0]).SetAttribute("src", "ms-appx:///Images/quanbu.png"); ((XmlElement)imageNode[0]).SetAttribute("alt", "寬圖"); //建立磁貼通知對象 TileNotification tileNotification = new TileNotification(tileXml); //更新tile TileUpdateManager.CreateTileUpdaterForApplication().Update(tileNotification); }
Note:
1、首先我們需要通過TileUpdateManager的GetTemplateContent()方法來獲得磁貼模板的XML文檔,
2、 然後就是通過一些XML的知識來給相應的節點進行賦值
3、接著我們就要建立磁貼通知對象TileNotification
4、最後發送磁貼更新
2、同時發送寬形通知和方形通知
上面的代碼只是建立了一個寬形的通知,當我們在首頁將通知表徵圖設為方形的時候因為系統不會有任何實踐通知,所以我們為了體驗更好的話我們最好在發送通知的時候我們同時設定方形和寬形通知。
//使用xmlDom同時添加寬型和方形通知 private void Button_Click_7(object sender, RoutedEventArgs e) { //寬形 XmlDocument tileXml = TileUpdateManager.GetTemplateContent(TileTemplateType.TileWideText03); XmlNodeList textNode = tileXml.GetElementsByTagName("text"); textNode[0].InnerText = "一個最多可包含三行自動換行較大文本的字串"; //方形 XmlDocument squareXml = TileUpdateManager.GetTemplateContent(TileTemplateType.TileSquareText04); XmlNodeList squareNode = squareXml.GetElementsByTagName("text"); squareNode[0].AppendChild(squareXml.CreateTextNode("一個覆蓋最多四行的文本字串"));//給文本節點賦值 IXmlNode node = tileXml.ImportNode(squareXml.GetElementsByTagName("binding").Item(0), true);//獲得方形Xml文本中的Binding節點及其子節點 tileXml.GetElementsByTagName("visual")[0].AppendChild(node);//將方形Binding節點中的內容添加到Visual節點中 //建立本地tile通知 TileNotification tileNotification = new TileNotification(tileXml); //更新本地通知 TileUpdateManager.CreateTileUpdaterForApplication().Update(tileNotification); }
Note:
這個實現也不難理解,要添加兩個通知也就是在XML文檔裡面的Visual裡同時添加兩個Binding,主要還是XML的操作
3、使用NotificationsExtensions庫
這個庫的功能是我們可以使用對象和屬性一樣來操作通知的文檔內容。
//使用NotificationsExtensions private void Button_Click_6(object sender, RoutedEventArgs e) { //獲得tile內容 ITileWideImageAndText01 tileContent = TileContentFactory.CreateTileWideImageAndText01(); tileContent.TextCaptionWrap.Text = "使用NotificationsExtension發送本地通知"; tileContent.Image.Src = "ms-appx:///Images/quanbu.png"; tileContent.Image.Alt = "寬徽標"; //添加方形通知 ITileSquareText02 tileSquareContetn = TileContentFactory.CreateTileSquareText02(); tileSquareContetn.TextHeading.Text = "標題"; tileSquareContetn.TextBodyWrap.Text = "這裡可以添加一個最多三行的文本"; //將方形通知內容綁定在寬形通知中 tileContent.SquareContent = tileSquareContetn; //建立tile通知 TileNotification tileNotification = tileContent.CreateNotification(); TileUpdateManager.CreateTileUpdaterForApplication().Update(tileNotification); }
Note:
1、首先我們需要引用一個NotificationsExtensions.winmd的檔案到項目中,然後我們添加對他的引用(參考MSDN的NotificationsExtensions庫)
2、然後我們在代碼中就可以通過裡面的一個TileContentFactory的類來獲得我們需要操作的對象,接著對相關屬性的設定
3、這段代碼同時設定了寬形和方形通知tileContent.SquareContent = tileSquareContetn;
4、啟用通知隊列
上面我們看到的都是只能顯示一個通知的樣本,下面我們來看一個多個通知的樣本,
首先我們需要允許通知隊列
protected override void OnNavigatedTo(NavigationEventArgs e) { //啟用通知隊列 TileUpdateManager.CreateTileUpdaterForApplication().EnableNotificationQueue(true); }
接著我麼可以添加多個通知
//使用通知隊列 private void Button_Click_4(object sender, RoutedEventArgs e) { for (int i = 1; i <= 7; i++) { //獲得指定模板圖塊的XML XmlDocument tileXml = TileUpdateManager.GetTemplateContent(TileTemplateType.TileWideImageAndText01); tbXml.Text = tileXml.GetXml();//可以查看每個模板的不同XML //給XML節點設定文本 XmlNodeList textNode = tileXml.GetElementsByTagName("text"); textNode[0].InnerText = string.Format("這是第{0}個Tile通知", i.ToString()); //添加映像 XmlNodeList imageNode = tileXml.GetElementsByTagName("image"); ((XmlElement)imageNode[0]).SetAttribute("src", "ms-appx:///Images/quanbu.png"); ((XmlElement)imageNode[0]).SetAttribute("alt", "寬圖"); //建立磁貼通知對象 TileNotification tileNotification = new TileNotification(tileXml); //若要覆蓋 FIFO 隊列行為,則可以為通知賦予標記。如果到達的新通知與現有通知擁有相同的標記,則新通知將替換現有通知 //如果隊列中的通知大於5個則先進入的會本刪除 //通知顯示的時候不一定和進入時的順序相同, tileNotification.Tag = i.ToString(); //更新tile TileUpdateManager.CreateTileUpdaterForApplication().Update(tileNotification); } }
Note:
1、上面我們通過了一個迴圈來添加多個通知,在使用多個通知之前我們必須先啟用通知隊列
2、最多隻能添加5個通知,遵循FIFO的規則,即當通知數量大於5個的時候最先進入隊列的通知會被刪除,但是我們也可以通過設定通知的Tag來更改這個規則,當我們具有相同Tag的通知進入隊列的時候,不管先進入的通知在什麼地方都會被替換,並且作為一個新的通知進入隊列。這樣子的話 我們就可以用隊列通知來實現一些股票新聞資訊的更新。
總結:
通知的本質就是一個XML文檔,我們只需要給這個文檔賦予相關的內容系統就會自動幫我們更新通知。
疑問???如果你知道 你一定要告訴我
1、我在想有沒有哪裡可以設定tile通知隊列的重新整理頻率(因為我看到其他tile通知的重新整理頻率比我自己建立的要快)
歡迎與鳥叔一起探討學習,共同成長,鳥叔的微博 多了特