鸟叔学Windows8开发(2):磁贴(Tile)和磁贴通知
首先我们来了解下在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通知的刷新频率比我自己创建的要快)
欢迎与鸟叔一起探讨学习,共同成长,鸟叔的微博 多了特