我正在开发一个 Live Tile APP 以在 Live Tile 上显示当前的网络状态。
我已经有一个工作的 XamlRenderingBackgroundTask,我可以从 XML 文件加载自定义平铺模板,然后使用 RenderTargetBitmap 将它渲染到 PNG 文件。
但是如果我启动 APP 并注册后台任务,我必须等到 BackgroundTask 开始看到更新的动态磁贴。
据我所知,无法从主应用程序中使用此代码。RendertargetBitmap 需要来自 XAML 树或 XamlRenderingBackgroundTask 的元素。
那么,我如何在注册任务后直接更新 Live Tile 呢?
var small_folder = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFolderAsync("Assets");
var small_file = await small_folder.GetFileAsync("WWAN_Tile_small.xml");
string small_szCustomTileXML = await Windows.Storage.FileIO.ReadTextAsync(small_file);
Border small_tile = XamlReader.Load(small_szCustomTileXML) as Border;
if (null != small_tile)
{
Grid grid = small_tile.Child as Grid;
Image logo = grid.FindName("img_Center") as Image;
var logo_img = new BitmapImage() { CreateOptions = BitmapCreateOptions.None };
logo_img.UriSource = new Uri("ms-appx:///Assets/Signal/WWAN/big/3.png");
logo.Source = logo_img;
RenderTargetBitmap rtb = new RenderTargetBitmap();
await rtb.RenderAsync(small_tile, 71, 71);
IBuffer pixels = await rtb.GetPixelsAsync();
DataReader dReader = Windows.Storage.Streams.DataReader.FromBuffer(pixels);
byte[] data = new byte[pixels.Length];
dReader.ReadBytes(data);
var outputFile = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync("Square71x71Logo.scale-100.png", Windows.Storage.CreationCollisionOption.ReplaceExisting);
var outputStream = await outputFile.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite);
BitmapEncoder enc = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, outputStream);
enc.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied, (uint)rtb.PixelWidth, (uint)rtb.PixelHeight, 96, 96, data);
await enc.FlushAsync();
}