• 【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模板都用过一遍,这样会很恐怖的,只要挑选需要的模板就可以了。

  • 相关阅读:
    PLSQL学习笔记 wm_concat
    Oracle ERP 公司间往来的解决方案(转载)
    Excel单元格设成只读
    PLSQL笔记 存在性检查
    PL/SQL编程技巧
    查看Oracle EBS克隆Clone时间
    用wm_concat合并行及merge into更新
    商务英语900句
    外企公司常用英文缩写
    ASP.NET 2.0 XML 系列(5):用XmlReader读取XML文档
  • 原文地址:https://www.cnblogs.com/tcjiaan/p/4068980.html
Copyright © 2020-2023  润新知