前面老周用了两篇烂文,向大家介绍了Adaptive磁贴的模板使用。那些XML模板已经很强大了,不过,如果你觉得那些排版还不足以满足需求,不妨试试自己来定义磁贴的内容。

其实,Runtime App支持在后台任务中生成XAML呈现,只要你编写的后台任务类从XamlRenderingBackgroundTask(位于Windows.UI.Xaml.Media.Imaging命名空间)类派生即可。利用这一特性,我们可以在后台生成XAML布局,然后通过RenderTargetBitmap类来呈现XAML内容,再把它保存为图片,最后把保存的图片作为磁贴的背景,就能达到自定义磁贴内容的功效了。

第一步,在主应用程序项目中,添加一个XAML文件,因为这个文件不参与编译,也没有对应的Code hide文件,就单个XAML文件即可,实际上是一个文本文件。因此,在生成操作上要设置为“内容”,是否复制到输出目录,选择“不复制”,自定义工具不用填。如图

然后你可以自己来设计排版,就和平时用XAML设计界面一样。

<Border
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
BorderThickness="0">
<Border.Background>
<ImageBrush AlignmentX="Center" AlignmentY="Center" Stretch="UniformToFill" ImageSource="Assets/1.jpg" />
</Border.Background>
</Border>

好了,我的界面就这样吧,简单好用。

第二步,向解决方案添加一个Windows运行时组件项目,用来在其中定义后台任务类。代码如下:

    public sealed class UpdatetileTask : XamlRenderingBackgroundTask
{
protected override async void OnRun(IBackgroundTaskInstance taskInstance)
{
……
}
}

注意,这里和以前我们定义普通的后台任务不同,这一次不是实现后台任务接口,而是从XamlRenderingBackgroundTask类派生,然后重写OnRun方法。
里面的处理和一般的后台任务一样了。

1、先要从项目目录加载我们刚才自己定义的那个.xaml文件。

            Border root = new Border();
Application.LoadComponent(root, new Uri("ms-appx:///customRender.xaml"));
root.Width = ;
root.Height = ;

LoadComponent是Application类的一个静态方法,直接调用即可,第一个参数是要生成的可视化对象的实例,第二个参数是XAML文件的URI。

我们声明的可视化对象的类型一定要与XAML文档中的根节点的类型匹配,上面在定义XAML文档时,根节点是Border,因此这里声明的变量类型必须为Border,LoadComponent方法调用后,会自动加载并编译XAML文档,然后填充Border变量。

为了让可视化对象能够呈现到位图中,记住要显示设置它的高度和宽度,因为默认情况下Width和Height都为0。

2、呈现XAML对象到位图。

            // 将XAML对象呈现到图像中
RenderTargetBitmap rtb = new RenderTargetBitmap();
// 因为示例是为宽磁贴生成背景图片的
// 所以目标的图像大小与宽磁贴相同即可
// 310 x 150
await rtb.RenderAsync(root, , );
// 取出图像数据
IBuffer bfData = await rtb.GetPixelsAsync();
// 将其转换为字节数组
byte[] data = bfData.ToArray();

3、在本地目录中创建新的PNG文件,并把呈现的XAML内容编码到图像文件中。

            // 在本地目录中创建新的PNG图像文件
StorageFolder localfd = ApplicationData.Current.LocalFolder;
StorageFile pngFile = await localfd.CreateFileAsync("bg.png", CreationCollisionOption.ReplaceExisting);
// 打开文件流
using (IRandomAccessStream stream = (await pngFile.OpenAsync(FileAccessMode.ReadWrite)))
{
// 创建PNG图像编码器
BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, stream);
// 设置图像数据
encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Straight, (uint)rtb.PixelWidth, (uint)rtb.PixelHeight, 72d, 72d, data);
await encoder.FlushAsync();
}

4、文件保存后,可以用ms-appdata:///local/开头的URI来访问文件。这时候,我们可以生成磁贴通知的XML文档,并更新磁贴。

            // 组创XML文档
string xml = "<tile>" +
"<visual>" +
"<binding template=\"TileWide\">" +
"<image src=\"ms-appdata:///local/bg.png\" placement=\"background\" />" +
"</binding>" +
"</visual>" +
"</tile>";
// 创建XML文档
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
// 更新磁贴通知
TileNotification notification = new TileNotification(doc);
TileUpdater updater = TileUpdateManager.CreateTileUpdaterForApplication();
updater.Update(notification);

第三步,在主应用程序中引用刚才的后台任务项目。然后配置一下清单文件,在正式版的SDK中,已经可以使用图形化的清单编辑器了,可以直接操作。

添加一个后台任务声明,类型为“常规”。

填上后台任务类的入口点,即类名,要包括命名空间的名字。

第四步,在前台代码中注册后台任务。前面的文章中,老周给大家介绍过可以通ApplicationTrigger直接在应用程序中触发后台任务,所以本示例我就用它了。

            var res = await BackgroundExecutionManager.RequestAccessAsync();
if (res == BackgroundAccessStatus.Denied || res == BackgroundAccessStatus.Unspecified)
{
Debug.WriteLine("后台任务被禁用。"); return;
} // 考虑注册后台任务
BackgroundTaskRegistration reg = BackgroundTaskRegistration.AllTasks.Values.FirstOrDefault(t => t.Name == TASK_NAME) as BackgroundTaskRegistration; if (reg == null)
{
BackgroundTaskBuilder bd = new BackgroundTaskBuilder();
bd.Name = TASK_NAME;
bd.TaskEntryPoint = typeof(backUpdater.UpdatetileTask).FullName;
ApplicationTrigger trigger = new ApplicationTrigger();
bd.SetTrigger(trigger);
reg = bd.Register();
}

最后,我们可以在代码中手动触发这个后台。

            BackgroundTaskRegistration reg = BackgroundTaskRegistration.AllTasks.Values.FirstOrDefault(t => t.Name == TASK_NAME) as BackgroundTaskRegistration;
if (reg == null)
{
return;
} ApplicationTrigger trigger = reg.Trigger as ApplicationTrigger;
await trigger.RequestAsync();

运行应用程序后,把程序固定到开始屏幕,并把图标改为宽磁贴,然后回到应用程序,触发后台,更新磁贴。

唉,天天写代码很枯燥,很无聊?没事,一起来坐在桃花底下读读《西厢记》,就会好的了。

OK,今天的牛皮暂时吹到这里。

例子源代码下载:http://files.cnblogs.com/files/tcjiaan/customTileUpdateApp.zip

【Win10应用开发】自定义磁贴通知的排版的更多相关文章

  1. Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构

    分享两篇Win 10应用开发的XML文档结构:Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构. Win 10 开发中Adapt ...

  2. [Win10应用开发] 如何使用Windows通知

    消息通知,是一个应用中必不可少的组成部分.Win10下提供了多种消息通知机制,Toast通知只是其中一种.这篇博文和大家分享一下,如何使用Toast通知. 上图是一个基本的Toast通知,那我们该如何 ...

  3. 【Win10 应用开发】自适应Toast通知的XML文档结构

    老规矩,在开始之前老周先讲个故事. 话说公元2015年7月20日,VS 2015发布.于是,肯定有人会问老周了,C#6有啥新特性,我学不来啊.学不来的话你应该检讨.老周比较保守地计算一下,学会C# 6 ...

  4. Windows Phone开发(44):推送通知第二集——磁贴通知

    原文:Windows Phone开发(44):推送通知第二集--磁贴通知 前面我们说了第一个类型--Toast通知,这玩意儿不知大家是不是觉得很新鲜,以前玩.NET编程应该没接触过吧? 其实这东西绝对 ...

  5. Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App

    安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneG ...

  6. 在 Visual C++ 中开发自定义的绘图控件

    本文讨论的重点介于两者 之间 — 公共控件赋予您想要的大部分功能,但控件的外观并不是您想要的.例如,列表视图控件提供在许多视图风格中显示数据列表的方式 — 小图标.大图标.列表和详细列表(报告).然而 ...

  7. Android开发自定义View

    Android中View组件的作用类似于Swing变成中的JPanel,它只是一个空白的矩形区域,View组件中没有任何内容.对于Android应用的其他UI组件来说,它们都继承了View组件,然后在 ...

  8. Win10 UWP 开发学习代码(不断更新)

    页面之间跳转(传值) string txt = "Spring Lee"; this.Frame.Navigate(typeof(BlankPage1),txt); 另一个页面接收 ...

  9. Win10/UWP开发—使用Cortana语音与App后台Service交互

    上篇文章中我们介绍了使用Cortana调用前台App,不熟悉的移步到:Win10/UWP开发—使用Cortana语音指令与App的前台交互,这篇我们讲讲如何使用Cortana调用App的后台任务,相比 ...

随机推荐

  1. 16-1-26---图解HTTP(01)

    图解HTTP1.4.2确保可靠性的HTTP协议    按层次分,TCP位于传输层,提供可靠的字节流服务    所谓字节流服务,指为了方便传输,将大块数据分割成以报文为单位的数据包进行管理,而可靠的传输 ...

  2. 基于2D-RNN的鲁棒行人跟踪

    基于2D-RNN的鲁棒行人跟踪 Recurrent Neural Networks RNN 行人跟踪 读"G.L. Masala, et.al., 2D Recurrent Neural N ...

  3. IIS最大连接数优化

    错误信息:Error Summary:HTTP Error 503.2 - Service UnavailableThe serverRuntime@appConcurrentRequestLimit ...

  4. ZOJ-3820 Building Fire Stations 题解

    题目大意: 一棵树,在其中找两个点,使得其他点到这两个的距离的较小值的最大值的最小值及其方案. 思路: 首先显然一棵树的直径的中点到其他点的距离的最大值必定比其他点的小. 那么感性思考一下就将一棵树的 ...

  5. WP8解析XML格式文件

    DOTA2 WebAPI请求返回的格式有两种,一种是XML,一种是JSON,默认是返回JSON格式,如果要返回XML格式的话,需要在加上format=xml. 这里举一个简单的解析XML格式的例子(更 ...

  6. LintCode 77: 最长公共子序列

    public class Solution { /** * @param A, B: Two string. * @return: the length of the longest common s ...

  7. python中__init__问题

    python中安装目录中的Lib文件夹模块中的__init__.py文件(文件内容可以为空),用于标识此文件夹是一个模块 python编程中的__init__表示初始化

  8. ThreadPoolExecutor源码学习(1)-- 主要思路

    ThreadPoolExecutor是JDK自带的并发包对于线程池的实现,从JDK1.5开始,直至我所阅读的1.6与1.7的并发包代码,从代码注释上看,均出自Doug Lea之手,从代码上看JDK1. ...

  9. eclipse导入项目出现叹号处理方法:

    1.选中该项目名称,单击右键 2.点击Properties 3.选中Java Build Path 4. 5. 6. 7.出现红叉的解决办法 8. 9. 10. 11. 12. 按照以上步骤操作就可以 ...

  10. PMP备考_第六章_项目时间管理

    项目时间管理 前言 项目时间管理是项目管理中最难的一个环节,与个人时间管理类似,团体的效率如果管理不当,是低于个人效率的,为了管理好时间,从预估,执行到反馈均需要严格的分析和处理.如果制定的计划是无法 ...