我正在生成一个图像并将其用作实时图像,以便我可以提供更多信息并更好地控制它的外观。 问题是,虽然我正在生成图像,但它不包括我自己的背景图像。
以下代码可以正常运行并提取图像
ShellTile defaultTile = ShellTile.ActiveTiles.First();
defaultTile.Update(new StandardTileData
{
Title = item2.NextDateTime.ToShortTimeString(),
BackBackgroundImage = new Uri("Images/Tiles/tilebacking.png", UriKind.Relative),
BackTitle = item2.NextDateTime.ToShortTimeString(),
BackContent = item2.Details
});
然而,以下代码在生成图像时不包括我的初始图像(根据Var徽标)。 我发现代码在网上执行此操作,除了包含我的初始背景图像外,它似乎工作正常。
var bmp = new WriteableBitmap(173, 173);
var logo = new BitmapImage(new Uri("Images/Tiles/tilebacking.png", UriKind.Relative));
var img = new Image { Source = logo };
// Force the bitmapimage to load it's properties so the transform will work
logo.CreateOptions = BitmapCreateOptions.None;
var bl = new TextBlock();
bl.Foreground = new SolidColorBrush(Colors.White);
bl.FontSize = 24.0;
bl.Text = "any text we want!";
bmp.Render(bl, null);
var tt = new TranslateTransform();
tt.X = 173 - logo.PixelWidth;
tt.Y = 173 - logo.PixelHeight;
bmp.Render(img, tt);
bmp.Invalidate();
using (var store = IsolatedStorageFile.GetUserStoreForApplication())
{
var filename = "/Shared/ShellContent/testtile.jpg";
using (var st = new IsolatedStorageFileStream(filename, FileMode.Create, FileAccess.Write, store))
{
bmp.SaveJpeg(st, 173, 173, 0, 100);
}
}
ShellTile defaultTile = ShellTile.ActiveTiles.First();
defaultTile.Update(new StandardTileData
{
Title = item2.NextDateTime.ToShortTimeString(),
BackgroundImage = new Uri("isostore:/Shared/ShellContent/testtile.jpg", UriKind.Absolute),
BackBackgroundImage = new Uri("isostore:/Shared/ShellContent/testtile.jpg", UriKind.Absolute),
BackTitle = item2.NextDateTime.ToShortTimeString(),
BackContent = item2.Details
});
有什么明显的事我在这里做错了。它是相同的文件和相同的文件路径,在第一个示例中工作正常。
感谢。
答案 0 :(得分:3)
您需要使用BitmapImage.ImageOpened事件来确保正确绘制。
这意味着您应该像这样编写代码:
var logo = new BitmapImage(new Uri("Images/Tiles/tilebacking.png", UriKind.Relative));
logo.CreateOptions = BitmapCreateOptions.None;
logo.ImageOpened += (sender, e) =>
{
var bmp = new WriteableBitmap(173, 173);
var bl = new TextBlock();
bl.Foreground = new SolidColorBrush(Colors.White);
bl.FontSize = 24.0;
bl.Text = "any text we want!";
bmp.Render(bl, null);
var tt = new TranslateTransform();
tt.X = 173 - logo.PixelWidth;
tt.Y = 173 - logo.PixelHeight;
bmp.Render(img, tt);
bmp.Invalidate();
using (var store = IsolatedStorageFile.GetUserStoreForApplication())
{
var filename = "/Shared/ShellContent/testtile.jpg";
using (var st = new IsolatedStorageFileStream(filename, FileMode.Create, FileAccess.Write, store))
{
bmp.SaveJpeg(st, 173, 173, 0, 100);
}
}
...
}
我写了一篇关于这个主题的指南:How To: Generate a custom live tile directly on the phone.