快速构建Windows 8风格应用31-构建磁贴

引言
磁贴是吸引用户经常使用应用重要手段之一。我们可将应用程序内较好的内容使用磁贴进行展示。
另外应用程序磁贴是应用程序中的核心部分,而且很可能也是用户最常见到的部分,因此利用动态磁贴来吸引用户经常使用我们的应用程序!

本篇博文主要介绍如何创建基本磁贴(也就是默认磁贴)以及如何使用本地通知更新磁贴。
一、创建基本磁贴
基本磁贴也可以叫做默认磁贴。通常我们点击基本磁贴来启动或者切换应用。
我们可以在应用程序清单文件中设置默认的静态磁贴,并且该静态磁贴分为两种大小:

注意:这两种大小的磁贴都可以被动态更新。那么我们怎么创建应用中的基本磁贴呢?
1.创建Windows 8 商店应用程序;
2.打开应用清单文件(package.appxmanifest),选择“应用程序 UI”窗口;
3.

- 使用自己的徽标图像路径取代默认的图像;
 - 设置磁贴上显示应用的短名称。注意:该名称不能超过 13 个字符。如果名称太长,将会被截断。当然我们可以选择显示徽标,显示名称或两者都不显示;
 - 选择名称的文本是使用浅色字体还是深色字体(基于背景色);
 - 也可设置背景色,该背景色用于对应用的其他部分进行着色,例如:任意应用中对话框的按钮颜色,以及 Windows 应用商店中的“应用详情”页等;
 
到此为止,我们设置的基本磁贴已经完成,当然我们也可以设置宽徽标、小徽标、应用商店徽标等徽标。

二、本地通知更新磁贴
其实更新磁贴的方式总共有四种(可参考选择通知传递方式),应用程序可使用本地通知来更新其磁贴,这对于正在运行的应用程序且信息发生变更的情形十分有效。
应用程序可在精确的时间点安排磁贴和 Toast 更新。另外应用程序可在未运行时通过云端进行更新磁贴。
那么我们使用本地通知更新磁贴呢?
1.添加命名空间
1: using Windows.UI.Notifications;
2: using Windows.Data.Xml.Dom;
其中Windows.UI.Notifications 包含磁贴 API。
2.选取模版并查看XML内容
我们可以使用系统提供的模版TileTemplateType,选择一个适合应用程序的模版。这里以TileWideImageAndText01 模板为例,该模版中需要一个图像和一个文本字符串。

1: XmlDocument tileXml = TileUpdateManager.GetTemplateContent(TileTemplateType.TileWideImageAndText01);
其中GetTemplateContent 方法检索一个 XmlDocument,该XML框架如下:
<tile>
<visual>
<binding template="TileWideImageAndText01">
<image id="1" src=""/>
<text id="1"></text>
</binding>
</visual>
</tile>
3.提供相关文本内容
   1:  XmlNodeList tileTextAttributes = tileXml.GetElementsByTagName("text");
2: tileTextAttributes[0].InnerText = "你好!测试磁贴更新~";
我们首先需要检索模板中标记名称为“text”的所有元素。TileWideImageAndText01 模板仅包含单个文本字符串,代码接着将分配该字符串。
注意:字符串中最多可以在两行内自动换行,因此应该相应地设置字符串的长度以避免截断。
4.提供图像
我们首先需要检索模板中标记名称为“image”的所有元素。TileWideImageAndText01 模板中包含单个图像。
注意:并非所有磁贴模板都包含图像,某些磁贴模板是仅文本的。
   1:  XmlNodeList tileImageAttributes = tileXml.GetElementsByTagName("image");
这里我们可以从应用的程序包中本地图像、应用的本地存储或者Web中获取图像。
注意:在包含多个图像的磁贴通知中,图像可以使用这些图像的任意组合,同时模版中图片大小必须小于200KB,像素小于1024*768。(可参考:磁贴和 Toast 图像大小)
- 使用应用程序包中本地图像:
 
   1:   ((XmlElement)tileImageAttributes[0]).SetAttribute("src", "ms-appx:///Assets/WideLogo.png");
   2:   ((XmlElement)tileImageAttributes[0]).SetAttribute("alt", "red graphic");
- 使用应用的本地存储图像:
 
   1:  ((XmlElement)tileImageAttributes[0]).SetAttribute("src", "ms-appdata:///local/redWide.png");
   2:  ((XmlElement)tileImageAttributes[0]).SetAttribute("alt", "red graphic");
- 使用Web中图像:
 
   1:  ((XmlElement)tileImageAttributes[0]).SetAttribute("src", "http://www.contoso.com/redWide.png");
   2:  ((XmlElement)tileImageAttributes[0]).SetAttribute("alt", "red graphic");
5.包含一个方形和宽版通知
首先我们在发送通知时,是无法知道当前应用程序的磁贴的状态是方形还是宽版。因此我们在更新通知时同时包括方形和宽版是最佳做法。
使用在宽版通知中使用的文本字符串定义了一个仅文本方形通知:
1: XmlDocument squareTileXml = TileUpdateManager.GetTemplateContent(TileTemplateType.TileSquareText04);
   2:  XmlNodeList squareTileTextAttributes = squareTileXml.GetElementsByTagName("text");
   3:  squareTileTextAttributes[0].AppendChild(squareTileXml.CreateTextNode("Hello World! My very own tile notification"));
然后我们向宽版磁贴的负载添加方形磁贴。检索在方形 TileXml 负载中定义方形磁贴的 binding 元素。作为宽版磁贴的同级附加该 binding 元素。
   1:  IXmlNode node = tileXml.ImportNode(squareTileXml.GetElementsByTagName("binding").Item(0), true);
   2:  tileXml.GetElementsByTagName("visual").Item(0).AppendChild(node);
6.创建通知
1: TileNotification tileNotification = new TileNotification(tileXml);
7.设置通知到期日期
默认情况下,本地磁贴和锁屏提醒不会过期,但是推送通知、定期通知、激活通知会在三天之后过期。通常我们会设置一个合理的过期时间。
注意:磁贴内容的保留时间应不长于内容具有相关性的时间。
1: tileNotification.ExpirationTime = DateTimeOffset.UtcNow.AddSeconds(10);
8.发送通知
1: TileUpdateManager.CreateTileUpdaterForApplication().Update(tileNotification);
9.清除磁贴通知
如果我们设置了通知过期时间,就不需要显示调用清除通知的方法。
1: Windows.UI.Notifications.TileUpdateManager.CreateTileUpdaterForApplication().Clear();
注意:我们不能通过云清除通知。
虽然在本地调用 Clear 方法会清除磁贴而不考虑其通知的来源,但是定期通知或推送通知只能将磁贴更新为新内容。
最后实现效果:
- 方形通知:
 


- 宽版通知:
 


更多关于磁贴介绍可参考:
快速构建Windows 8风格应用31-构建磁贴的更多相关文章
- 快速构建Windows 8风格应用15-ShareContract构建
		
原文:快速构建Windows 8风格应用15-ShareContract构建 本篇博文主要介绍共享数据包.如何构建共享源.如何构建共享目标.DataTransferManager类. 共享数据包 Da ...
 - 快速构建Windows 8风格应用13-SearchContract构建
		
原文:快速构建Windows 8风格应用13-SearchContract构建 本篇博文主要介绍如何在应用中构建SearchContract,相应的原理已经在博文<快速构建Windows 8风格 ...
 - 快速构建Windows 8风格应用32-构建辅助磁贴
		
原文:快速构建Windows 8风格应用32-构建辅助磁贴 引言 Windows Phone中,我们开发者可能会开发的一个功能点是将数据列表中某一项"Pin To Start(固定到开始屏幕 ...
 - 快速构建Windows 8风格应用17-布局控件
		
原文:快速构建Windows 8风格应用17-布局控件 本篇博文主要介绍三种常用的布局控件:Canvas.Grid.StackPanel. Panel类是开发Windows 8 Store应用中一个重 ...
 - 快速构建Windows 8风格应用14-ShareContract概述及原理
		
原文:快速构建Windows 8风格应用14-ShareContract概述及原理 本篇博文主要介绍Share Contract概述.Share Contract实现原理.实现Share Contra ...
 - 快速构建Windows 8风格应用9-竖直视图
		
原文:快速构建Windows 8风格应用9-竖直视图 本篇博文主要介绍竖直视图概览.关于竖直视图设计.如何构建竖直视图 竖直视图概览 Windows 8为了支持旋转的设备提供了竖屏视图,我们开发的应用 ...
 - 快速构建Windows 8风格应用10-设备方向
		
原文:快速构建Windows 8风格应用10-设备方向 本篇博文主要介绍常用支持Windows 8操作系统设备的方向.如何获取当前设备方向.DisplayProperties类. 常用支持Window ...
 - 快速构建Windows 8风格应用11-语义缩放
		
原文:快速构建Windows 8风格应用11-语义缩放 本篇博文主要介绍为什么需要语义缩放.什么是语义缩放.如何构建语义缩放. 为什么需要语义缩放 如果用过Windows 8系统的开发者都知道在Win ...
 - 快速构建Windows 8风格应用12-SearchContract概述及原理
		
原文:快速构建Windows 8风格应用12-SearchContract概述及原理 本篇博文主要介绍Search Contract概述.Search Contract面板结构剖析.Search Co ...
 
随机推荐
- Windows 怎么知道我已连线到网际网络? 原来当中大有文章!
			
原文 Windows 怎么知道我已连线到网际网络? 原来当中大有文章! 标题这个问题好像很简单, 但原来深入研究起来还真的不是”因为我能看到网页嘛”这样简单的答案. 研究这个课题是由于公司内部的防火墙 ...
 - Benchmark与Profiler---性能调优得力助手
			
转载请注明出处:http://blog.csdn.net/gaoyanjie55/article/details/34981077 性能优化.它是一种诊断性能瓶颈,能问题点进行优化的过程.前两天听完s ...
 - ContentProvider总结(Android)
			
ContentProvider 1.适用场景 1) ContentProvider为存储和读取数据提供了统一的接口 2) 使用ContentProvider,应用程序能够实现数据共享 3) andro ...
 - SQLServer 存储过程嵌套事务处理
			
原文:SQLServer 存储过程嵌套事务处理 某个存储过程可能被单独调用,也可能由其他存储过程嵌套调用,则可能会发生嵌套事务的情形. 下面是一种解决存储过程嵌套调用的通用代码,在不能确定存储过程是否 ...
 - 基于低压电力采集平台DW710C的基础开发
			
实验课题 (1)自己定义通信规约,採用java或C++编写简单的PC端上位机软件,实现採集器与PC机的通信.实验可在DW710C-PCproject下进行. (2)实现LCD显示字符.数字.汉字和简单 ...
 - 接收一个IT招聘促销信息,试着想参加,有兴趣的可以携手并进,共同。
			
时隆重举行! 招聘的企业: (个人认为,中智.也买酒还是非常有吸引力的) watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHdia2Zj/font/5a6L ...
 - 集成 NHibernate
			
ABP 基础设施层——集成 NHibernate 本文翻译自ABP的官方教程<NHibernate Integration>,地址为:http://aspnetboilerplate.co ...
 - WebApi的一种集成测试写法(in-memory)
			
WebApi的一种集成测试写法(in-memory) 大家是如何对webApi写测试的呢? 1.利用Fiddler直接做请求,观察response的内容. 2.利用Httpclient做请求,断言 ...
 - POJ 2352 && HDU 1541 Stars (树状数组)
			
一開始想,总感觉是DP,但是最后什么都没想到.还暴力的交了一发. 然后開始写线段树,结果超时.感觉自己线段树的写法有问题.改天再写.先把树状数组的写法贴出来吧. ~~~~~~~~~~~~~~~~~~~ ...
 - 大数据系列修炼-Scala课程11
			
接着昨天的list,也是学习集合的相关知识 ListBuffer.ArrayBuffer.Queue.stack相关操作 1.ListBuffer.ArrayBuffer代码实现:ListBuffer ...