一般应用程序都会包含多个尺寸的磁贴,如小磁贴(71×71)、中磁贴(150×150)和宽磁贴(310×150)。常规的磁贴更新做法是用XML文档来定义更新内容,然后再提交更新。如:

<tile>
  <visual version="2">
    <binding template="TileSquare150x150Text02" fallback="TileSquareText02">
      <text id="1"></text>
      <text id="2"></text>
    </binding>
  </visual>
</tile>

不过这样只是150×150大小的磁贴被更新,我们无法确定用户正在使用哪个尺寸的磁贴,有可能用户正在用310×150的宽磁贴,也许大家会想到,那就再对宽磁贴进行一次更新,如:

<tile>
  <visual version="2">
    <binding template="TileWide310x150Image" fallback="TileWideImage">
      <image id="1" src=""/>
    </binding>
  </visual>
</tile>

以上做法是分两次更新的,那么,有没有可能做到一次更新就能同时修改150x150,以及310x150两种磁贴呢?

先来分析一下,定义磁贴的XML文档是以一个tile元素作为根节点的,表示它更新的是磁贴,而不是发出Toast通知,接下来在tile中包含单个visual元素,visual元素下面是binding元素。

对了,技巧就在这里了,根据文档的说明,visual元素是可以包含多个binding元素的,而一般一个binding就是描述一个模板的磁贴

啊,有思路了吧? 你应该猜到了,就是在visual元素下多放几个binding元素,就能同时更新多种磁贴了。

举个例子,假设我有一个应用同时支持多种尺寸的磁贴,我希望可以同时更新150x150的和310x150两种磁贴,那么我只要把XML文档变为这样就可以了。

               <tile>
<visual version="2">
<!-- 宽磁贴 -->
<binding template="TileWide310x150BlockAndText02" fallback="TileWideBlockAndText02">
<text id="1">Text Field 1</text>
<text id="2">Text Field 2 (block text)</text>
<text id="3">Text Field 3 (under block text)</text>
</binding>
<!-- 中型磁贴 -->
<binding template="TileSquare150x150Text02" fallback="TileSquareText02">
<text id="1">Text Field 1 (larger text)</text>
<text id="2">Text Field 2</text>
</binding>
</visual>
</tile>

如何? 咱们试试,看能不能实现。

            XmlDocument docx = new XmlDocument();
// 创建根节点
XmlElement tile = docx.CreateElement("tile");
docx.AppendChild(tile);
// 创建visual元素
var visual = docx.CreateElement("visual");
// 设置特性
visual.SetAttribute("version", "");
tile.AppendChild(visual);
// 添加第一个binding元素
var binding = docx.CreateElement("binding");
binding.SetAttribute("template", "TileSquare150x150Text02");
binding.SetAttribute("fallback", "TileSquareText02");
visual.AppendChild(binding);
// 创建两个字段
{
var text1 = docx.CreateElement("text");
binding.AppendChild(text1);
text1.SetAttribute("id", "");
var textNode = docx.CreateTextNode(this.txtLarge.Text);
text1.AppendChild(textNode);
var text2 = docx.CreateElement("text");
binding.AppendChild(text2);
text2.SetAttribute("id", "");
textNode = docx.CreateTextNode(txtContent.Text);
text2.AppendChild(textNode);
}
// 添加第二个binding元素
binding = docx.CreateElement("binding");
visual.AppendChild(binding);
binding.SetAttribute("template", "TileWide310x150BlockAndText02");
binding.SetAttribute("fallback", "TileWideBlockAndText02");
// 添加三个字段
{
var text1 = docx.CreateElement("text");
binding.AppendChild(text1);
text1.SetAttribute("id", "");
var textNode = docx.CreateTextNode(this.txtLargeBlock.Text);
text1.AppendChild(textNode);
var text2 = docx.CreateElement("text");
binding.AppendChild(text2);
text2.SetAttribute("id", "");
textNode = docx.CreateTextNode(this.txtUnderBlock.Text);
text2.AppendChild(textNode);
var text3 = docx.CreateElement("text");
binding.AppendChild(text3);
text3.SetAttribute("id", "");
textNode = docx.CreateTextNode(this.txtNormalText.Text);
text3.AppendChild(textNode);
}
// 输出一下,以检查是否正确
System.Diagnostics.Debug.WriteLine(docx.GetXml()); // 2、创建通知更新
TileNotification notifi = new TileNotification(docx);
TileUpdateManager.CreateTileUpdaterForApplication().Update(notifi);

我这里是用位于Windows.Data.Xml.Dom命名空间下的API来创建XML文档的,如果你觉得这个太复杂,容易混乱,那你可以考虑直接拼接文本,这样可能不容易弄错。
好,看看效果。

  

如何如何,这样是不是省事了。

示例代码:http://files.cnblogs.com/tcjiaan/MultipTileUpdateApp.zip

最后我再废话一下,不管是磁贴还是Toast通知的XML文档,千万不要去死记硬背,不用记的,用的时候查文档就行了;而且,要有选择性地运用,也没必要在一个应用中把所有的XML模板都用过一遍,这样会很恐怖的,只要挑选需要的模板就可以了。

【WP 8.1开发】同时更新多种磁贴的更多相关文章

  1. 【WP 8.1开发】How to 图像处理

    在今天的吹牛节目开始之前,先交代一件事: 关于玩WP 8.1开发所使用的VS版本问题.对版本的要求是2013的Update2,这是最低要求,只要是这个版本或以上都可以,而update3,update4 ...

  2. 没有苹果电脑打包iOS平台的 Ionic 2程序——《Ionic 2 实例开发》更新内容

    没有苹果电脑打包iOS平台的 Ionic 2程序--<Ionic 2 实例开发>更新内容春节刚过,祝各位新的一年里万事如意,一帆风顺.<Ionic 2 实例开发>在这段时间里更 ...

  3. HDU4578 线段树(区间更新 + 多种操作)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4578  , 线段树的区间更新 + 多种操作,好题. 虽然是比较裸的线段树,但是比较麻烦,并且有很多细节 ...

  4. Android研究之游戏开发摄像头更新

     游戏中摄像头的原理介绍        在游戏开发中更新摄像头的位置能够决定屏幕显示的内容,尤其是RPG类游戏摄像头有着很关键的数据.我举一个样例 有时候我们在玩RPG游戏的时候进入一个新的场景 ...

  5. 【WP 8.1开发】自定义(RAW)通知的使用

    继续前面的话题,还是推送通知.上一篇文章中遗留了RAW通知的推送没有给各位演示,特特地留到现在,不为别的,只为这个RAW通知有点意思,玩起来会比较有意思.官方文档将RAW通知译为“原始通知”,这里还是 ...

  6. 【WP 8.1开发】手机客户端应用接收推送通知

    上一篇文章中,已经完成了用于发送通知的服务器端,接下来我们就用这个服务端来测试一下. 在开始测试之前,我们要做一个接收通知的WP应用. 1.启动VS Express for Windows,新建项目, ...

  7. 【WP 8.1开发】解决调用真实摄像头会死机的问题

    无论你是用Silverlight还是用RT的API来开发,在使用MediaCapture拍照片或录视频时,要是在模拟器上运行会万事大吉:但是,一旦放到真实手机上运行,肯定有人发现了,细心的朋友肯定发现 ...

  8. 【WP 8.1开发】推送通知测试服务端程序

    所谓推送通知,用老爷爷都能听懂的话说,就是: 1.我的服务器将通知内容发送到微软的通知服务器,再由通知服务器帮我转发消息. 2.那么,微软的推送服务器是如何知道我的服务器要发消息给哪台手机呢?手机客户 ...

  9. 【WP 8.1开发】一键锁屏

    在WP8的时候,关于如何关闭屏幕,国内外都有不少文章了,大家有兴趣地可以搜搜,很多,我就不给链接了,因为稍后我的例子中会有. 其实,关闭屏幕是调用了未开放的API,正因为这个API未开放的,不敢保证所 ...

随机推荐

  1. Android ListView onItemClick Not Work

    Android ListView onItemClick Not Work ListView item中有Button和RadioButton的时候,它的Item点击事件不起作用,需要设置item的属 ...

  2. ssh端口转发

    http://blog.sina.com.cn/s/blog_47094def0101fvge.html

  3. jquery操作dom

    1访问元素(属性,内容,值,css) 1元素属性(获取,设置,删除) .attr(name) .attr(key, value)  || .attr({key0:value0, key1:value1 ...

  4. css长度值与颜色值

    颜色值 在网页中的颜色设置是非常重要的,有字体颜色,背景颜色,边框颜色等,设置颜色的方法也有很多种: 1.英文命令颜色 p{color:red;} 2.rgb颜色 p{color:rgb(133,45 ...

  5. java 中 finally里面写了return 会发生什么?

    boolean test() throws Exception { boolean ret = true; try { int b = 12; int c; for (int i = 1; i > ...

  6. c语言编译器(linux平台下安装c语言环境)一

    gcc : 语言的默认编译器     (ubuntu下输入gcc,可根据终端输出查看是否安装了gcc) g++ : c++的默认编译器   (ubuntu下输入g++,可根据终端输出查看是否安装了g+ ...

  7. C#动态调用WCF

    public class WcfChannelFactory { public WcfChannelFactory() { } /// <summary> /// 执行方法 WSHttpB ...

  8. Java语法糖2:自动装箱和自动拆箱

    前言 一开始想学学自动拆箱和自动装箱是被这个名字吸引到,听上去好像很高端的样子,其实自动拆箱.自动装箱是很简单的内容. 自动拆箱和自动装箱 Java为每种基本数据类型都提供了对应的包装器类型.举个例子 ...

  9. 说说WeakReference弱引用

    WeakReference弱引用概述 http://www.cnblogs.com/xrq730/p/4836700.html,关于Java的四种引用状态具体请参看此文 Java里一个对象obj被创建 ...

  10. ACEXML解析XML文件——简单示例程序

    掌握了ACMXML库解析XML文件的方法后,下面来实现一个比较完整的程序. 定义基本结构 xml文件格式如下 <?xml version="1.0"?> <roo ...