【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文档的,如果你觉得这个太复杂,容易混乱,那你可以考虑直接拼接文本,这样可能不容易弄错。
好,看看效果。
如何如何,这样是不是省事了。
示例代码:https://files.cnblogs.com/tcjiaan/MultipTileUpdateApp.zip
最后我再废话一下,不管是磁贴还是Toast通知的XML文档,千万不要去死记硬背,不用记的,用的时候查文档就行了;而且,要有选择性地运用,也没必要在一个应用中把所有的XML模板都用过一遍,这样会很恐怖的,只要挑选需要的模板就可以了。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战