【发布时间】:2014-11-08 21:54:16
【问题描述】:
我正在开发一个 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();
}
【问题讨论】:
标签: c# xaml windows-phone rendertargetbitmap