目前Windows Phone 8.1所支持磁贴像素大小有71x71、150x150和310x150,分为大中小三种模式,对于桌面磁贴微软提供的诸多模板http://msdn.microsoft.com/zh-cn/library/windows/apps/hh761491.aspx,模板功能比较简单,就是图像和文字的结合,如果要实现复杂的磁贴组合,比较天气预报那样的磁贴,那就要微软RenderTargetBitmap类事先生成图像,再更新到磁贴。

我们写一个静态方法。在使用RenderTargetBitmap类的同时,建议去看一下微软的关于此类的用法,参数中的element元素也有所限制。

1.一些视频无法生成图像。

2.自定义一些第三方插件无法生成图像。

3.元素visibility必须要为visible。

4.元素必须要在屏幕元素的视觉树中,比如动态创建一个元素,那么就无法生成该元素的图像,出现空白。建议预先将元素写在xaml中并设置opacity为0即可。

  1. public static async System.Threading.Tasks.Task RenderImage(Windows.UI.Xaml.UIElement element, string filename)
  2. {
  3. Windows.UI.Xaml.Media.Imaging.RenderTargetBitmap renderTargetBitmap = new Windows.UI.Xaml.Media.Imaging.RenderTargetBitmap();
  4. await renderTargetBitmap.RenderAsync(element, (int)element.DesiredSize.Width, (int)element.DesiredSize.Height);
  5. Windows.Storage.Streams.IBuffer pixelBuffer = await renderTargetBitmap.GetPixelsAsync();
  6. var width = renderTargetBitmap.PixelWidth;
  7. var height = renderTargetBitmap.PixelHeight;
  8.  
  9. Windows.Storage.StorageFile storageFile = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync(filename, Windows.Storage.CreationCollisionOption.ReplaceExisting);
  10. using (var stream = await storageFile.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite))
  11. {
  12. var encoder = await Windows.Graphics.Imaging.BitmapEncoder.CreateAsync(Windows.Graphics.Imaging.BitmapEncoder.JpegEncoderId, stream);
  13. encoder.SetPixelData(Windows.Graphics.Imaging.BitmapPixelFormat.Bgra8, Windows.Graphics.Imaging.BitmapAlphaMode.Ignore,
  14. (uint)width, (uint)height, , , pixelBuffer.ToArray());
  15. await encoder.FlushAsync();
  16. }
  17. }

那么在xaml我们可以这样做。

  1. <Grid Opacity="0">
  2. <Grid x:Name="Tile310x150f" Width="310" Height="150">
  3. <!--内容-->
  4. </Grid>
  5. <Grid x:Name="Tile310x150b" Width="310" Height="150">
  6. <!--内容-->
  7. </Grid>
  8. </Grid>

现在我们在后台来刷新图像。

  1. public async Task RefreshImage()
  2. {
  3. Grid render310x150f = this.ViewControl.FindName("Tile310x150f") as Grid;
  4. await Common.Common.RenderImage(render310x150f, "Tile310x150f.jpg");
  5.  
  6. Grid render310x150b = this.ViewControl.FindName("Tile310x150b") as Grid;
  7. await Common.Common.RenderImage(render310x150b, "Tile310x150b.jpg");
  8. }

然后pin到桌面。这里提醒一点,RefreshImage要在RequestCreateAsync前执行完成,因为当启用磁贴pin时,页面会跳转到桌面,否则会发生截图空白。

  1. public async void PinTile(string tileId)
  2. {
  3. Uri uri = new Uri("ms-appdata:///local/Tile71x71f.jpg");
  4. Windows.UI.StartScreen.SecondaryTile tile = new Windows.UI.StartScreen.SecondaryTile(tileId, "", "/MainPage.xaml", uri, Windows.UI.StartScreen.TileSize.Default);
  5. tile.VisualElements.Wide310x150Logo = uri;
  6. tile.DisplayName = " ";
  7.  
  8. await RefreshImage();
  9.  
  10. this.isPin = await tile.RequestCreateAsync();
  11. this.PinVisible = Visibility.Collapsed;
  12. this.UnpinVisible = Visibility.Visible;
  13.  
  14. this.UpdateTile();
  15. }

接下来是update tile的方法,这里的GetTemplateContent就是为了获取微软磁贴预制的模板,update其实是即时信息展示,并不是刻意为了磁贴动态的效果。

  1. public void UpdateTile()
  2. {
  3. if (isPin)
  4. {
  5. var updator = Windows.UI.Notifications.TileUpdateManager.CreateTileUpdaterForSecondaryTile(this.tileId);
  6. updator.Clear();
  7. updator.EnableNotificationQueue(true);
  8.  
  9. var tile310x150f = Windows.UI.Notifications.TileUpdateManager.GetTemplateContent(Windows.UI.Notifications.TileTemplateType.TileWide310x150Image);
  10. var tile310x150b = Windows.UI.Notifications.TileUpdateManager.GetTemplateContent(Windows.UI.Notifications.TileTemplateType.TileWide310x150Image);
  11.  
  12. var imageElement = tile310x150f.GetElementsByTagName("image")[];
  13. imageElement.Attributes.GetNamedItem("src").NodeValue = "ms-appdata:///local/Tile310x150f.jpg";
  14. var notification = new Windows.UI.Notifications.TileNotification(tile310x150f);
  15. updator.Update(notification);
  16.  
  17. imageElement = tile310x150b.GetElementsByTagName("image")[];
  18. imageElement.Attributes.GetNamedItem("src").NodeValue = "ms-appdata:///local/Tile310x150b.jpg";
  19. notification = new Windows.UI.Notifications.TileNotification(tile310x150b);
  20. updator.Update(notification);
  21. }
  22. }

wp8.1 创建动态磁贴应用的更多相关文章

  1. WP8.1 Study18:动态磁贴

    一.前言 动态磁贴在WindowsPhone8.1和Windows8.1都是其特色,有人喜欢有人讨厌,不过我觉得还是挺好的,可以让使用者很快知道App内的内容和吸引使用者打开App.下面来学习下怎样添 ...

  2. 【Win10 UWP】后台任务与动态磁贴

    动态磁贴(Live Tile)是WP系统的大亮点之一,一直以来受到广大用户的喜爱.这一讲主要研究如何在UWP应用里通过后台任务添加和使用动态磁贴功能. 从WP7到Win8,再到Win10 UWP,磁贴 ...

  3. GifShot - 创建动态 GIF 的 JavaScript 库

    GifShot 是一个可以创建流媒体,视频或图像的 GIF 动画的 JavaScript 库.该库的客户端特性使其非常便携,易于集成到几乎任何网站.利用最先进的浏览器 API ,包括 WebRTC , ...

  4. Unity3D 创建动态的立方体图系统

    Unity3D 创建动态的立方体图系统 这一篇主要是利用上一篇的Shader,通过脚本来完成一个动态的立方体图变化系统. 准备工作如下: 创建一个新的场景.一个球体.提供给场景一个平行光,准备2个立方 ...

  5. Ribbon2: 创建动态的Ribbon库

    Sam Radakovitz曾在Excel团队博客中发表过一篇文章,介绍了如何创建动态的Ribbon库,即如何通过RibbonX和VBA放置动态的图形图像到功能区库中,在该文中,作者创建了两个库:一个 ...

  6. Win8.1应用开发之动态磁贴

    using demo02.Common; using System; using System.Collections.Generic; using System.IO; using System.L ...

  7. 【ASP.NET Web API教程】2.3.5 用Knockout.js创建动态UI

    原文:[ASP.NET Web API教程]2.3.5 用Knockout.js创建动态UI 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的内容 ...

  8. springmvc 项目完整示例02 项目创建-eclipse创建动态web项目 配置文件 junit单元测试

    包结构 所需要的jar包直接拷贝到lib目录下 然后选定 build path 之后开始写项目代码 配置文件 ApplicationContext.xml <?xml version=" ...

  9. 使用Eclipse创建动态的web工程

    使用Eclipse创建动态的web工程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.修改工作区的编码 1>.点击Window选择Preferences 2>.将默 ...

随机推荐

  1. win2008以上的系统,在vmware esxi5.5里怎么使用自定义规范管理器?sysprep

    经过测试,原来08以上的系统自带了sysprep.exe,所以vcenter对08以上的系统直接使用自定义规范管理器即可,跟linux一样了.注意不要跟03一样写入了sn即可. vCenter可使用s ...

  2. Waiting for device dev/disk/by-id/ata-...-part2 to appear

    问题: 平台:Oralce VM Virtualbox的虚拟机Opensuse11.4 导出该机器的OVA文件后,把该OVA文件导入虚拟机,开机启动时报如下错误: Trying manual resu ...

  3. Codeforces Round #474-E(树形dp)

    一.题目链接 http://codeforces.com/contest/960/problem/B 二.题意 给定一棵$N$个节点的树,每个节点的权值$V$.定义树中两点$u_1$和$u_m$的权值 ...

  4. SmallLocks

    folly/SmallLocks.h This module is currently x64 only. This header defines two very small mutex types ...

  5. Sql Server-使用Sql Server自带的分词功能实现字段关键词提取(分词能力很低,慎用)

    “创建全文索引 启动服务 在SQL Server配置管理工具中,找到'SQL Full-text Filter Daemon Launcher'服务用本地用户启动. 创建全文目录 打开需要创建全文目录 ...

  6. python3.6编程第一课画个五角星

    使用的是海龟图库  turtle import turtle turtle.forward(100) turtle.right(144) turtle.forward(100) turtle.righ ...

  7. MyBatis 延迟加载 加载时机

  8. TIME_WAIT和CLOSE_WAIT状态区别

    [TIME_WAIT和CLOSE_WAIT状态区别] 常用的三个状态是:ESTABLISHED 表示正在通信,TIME_WAIT 表示主动关闭,CLOSE_WAIT 表示被动关闭. TCP协议规定,对 ...

  9. Android 建立Menu选单&&onOptionsItemSelected (转)

    /** 当Menu有命令被选择时,会调用此方法 */ @Override public boolean onOptionsItemSelected(MenuItem item) { switch (i ...

  10. 【poj2411】Mondriaan's Dream 状态压缩dp

    AC传送门:http://vjudge.net/problem/POJ-2411 [题目大意] 有一个W行H列的广场,需要用1*2小砖铺盖,小砖之间互相不能重叠,问有多少种不同的铺法? [题解] 对于 ...