【WP 8.1开发】同时更新多种磁贴

一般应用程序都会包含多个尺寸的磁贴,如小磁贴(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", "2");
            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", "1");
                var textNode = docx.CreateTextNode(this.txtLarge.Text);
                text1.AppendChild(textNode);
                var text2 = docx.CreateElement("text");
                binding.AppendChild(text2);
                text2.SetAttribute("id", "2");
                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", "1");
                var textNode = docx.CreateTextNode(this.txtLargeBlock.Text);
                text1.AppendChild(textNode);
                var text2 = docx.CreateElement("text");
                binding.AppendChild(text2);
                text2.SetAttribute("id", "2");
                textNode = docx.CreateTextNode(this.txtUnderBlock.Text);
                text2.AppendChild(textNode);
                var text3 = docx.CreateElement("text");
                binding.AppendChild(text3);
                text3.SetAttribute("id", "3");
                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模板都用过一遍,这样会很恐怖的,只要挑选需要的模板就可以了。

时间: 2024-10-03 23:17:46

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

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

继续前面的话题,还是推送通知.上一篇文章中遗留了RAW通知的推送没有给各位演示,特特地留到现在,不为别的,只为这个RAW通知有点意思,玩起来会比较有意思.官方文档将RAW通知译为“原始通知”,这里还是沿用官方的翻译. 在开始吹牛之前,先说一说与推送通知相关的要点. 有人说,如果我有22222222个客户端,岂不是都要获取每个手机客户端的通道URL来推送吗?是的.于是有人想到了所谓的“极光推送”,忽悠人的,“极光”显然偷换了概念.我们得明确,在什么情况下才会考虑使用推送. 推送好比服务器与手机客户

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

上一篇文章中,已经完成了用于发送通知的服务器端,接下来我们就用这个服务端来测试一下. 在开始测试之前,我们要做一个接收通知的WP应用. 1.启动VS Express for Windows,新建项目,在项目模板中选择“空白应用程序(Windows Phone)”. 2.既然要接收通知,肯定少不了Toast.磁贴这几样常用的通知的,故我们得先准备一些图片. 在“解决方案资源管理器”中,双击打开清单文件,切换到“可见资产”选项卡,这个“资产”指的不你的银行卡存款有多少,而是你的应用中的一些如图片.音

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

在今天的吹牛节目开始之前,先交代一件事: 关于玩WP 8.1开发所使用的VS版本问题.对版本的要求是2013的Update2,这是最低要求,只要是这个版本或以上都可以,而update3,update4,update5是不是必须更新呢?不是的,VS的update是可选的,而且每个update都会累积,所以,update越多,安装包的体积越大.因此,WP开发我们只需update2就行了,我用的也是u2.如果你觉得MSDN原版不好下,可以从下面的地址下,我已经把相关的.iso上传到115.这里面是旗舰

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

所谓推送通知,用老爷爷都能听懂的话说,就是: 1.我的服务器将通知内容发送到微软的通知服务器,再由通知服务器帮我转发消息. 2.那么,微软的推送服务器是如何知道我的服务器要发消息给哪台手机呢?手机客户端应用程序在创建推送通道时,微软的通知服务器会为手机分配一个URL,我的服务器只要知道这个URL就可以向指定的手机发送消息.所以,手机客户端必须通过网络把获取到的手机URL发给我的服务器,方法很多,如使用Socket.HTTP提交.Web服务.WCF等都可以. 要测试推送通知,可以通过WP 8.1的

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

没有苹果电脑打包iOS平台的 Ionic 2程序--<Ionic 2 实例开发>更新内容春节刚过,祝各位新的一年里万事如意,一帆风顺.<Ionic 2 实例开发>在这段时间里更新了如下内容:Ionic 2 中使用管道处理数据Ionic 2 中使用HTTP与远程服务器交互数据Ionic 2 中的样式与主题没有苹果电脑打包iOS平台的 Ionic 2程序欢迎阅读.

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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4578  , 线段树的区间更新 + 多种操作,好题. 虽然是比较裸的线段树,但是比较麻烦,并且有很多细节需要考虑,最后我7.3s很惊险地过了,求大神告知优化方法. 这道题坑在有三种询问:set , add , mul.所以lazy标记要有三个,如果三个标记同时出现的处理方法——当更新set操作时,就把add标记和mul标记全部取消:当更新mul操作时,如果当前节点add标记存在,就把add标记改为:a

配送短信猫二次开发接口提供多种开发语言示例

免费配送的信猫二次开发接口提供有多种开发语言示例,如C#.C++.Delphi.PowerBuilder.VB.net.VC++.VisualBasic等多种开发示例方便程序开发人员开发调试.使用简单方便,将sms.dll文件拷贝到系统安装目录中的system32文件夹中,然后再根据以下接口函数说明和提供的例程源码开发,无需安装,免加密狗. 短信猫二次开发接口提供的开发语言示例有: 部分短信猫二次开发接口函数说明: 1.Sms_Connection(Com_Port As Integer,Com

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

 游戏中摄像头的原理介绍        在游戏开发中更新摄像头的位置可以决定屏幕显示的内容,尤其是RPG类游戏摄像头有着非常重要的作用,我举一个例子 有时候我们在玩RPG游戏的时候进入一个新的场景 触发一段脚本后 发现镜头开始向上移动 根据镜头移动玩家可以大概浏览一下这个场景有什么东西 ,触发什么样的剧情.这个实现的方式就是游戏摄像头原理.上章学习了Android游戏开发地图编辑器有需要的可以看下. 如图所示:首先摄像头显示的区域也是手机屏幕显示的区域 如果需要更改摄像头的位置  其实是更改

【WP 8.1开发】如何把自定义字体塞进应用里

或许,系统自带的字体不足以体现应用程序的魅力,对于表现极强的汉字来说,更是如此.这时候,我们就会想,要是能把网上下载的艺术字体塞到应用包中,那岂不美哉?那么,这可以实现吗?答案是Yes的. 接下来,阿拉就给大家分别演示WP 8.1两个开发框架中如何嵌入自定义字体. 为啥是两大框架?我们知道从7x到8.0的开发框架是Silverlight for Windows Phone,为了便于兼容和直接项目升级,在8.1中,微软的开发团队依然保留了这个框架:另外一个框架是从Win RT应用移植的API集,这