我在将 UserControl 保存为 JPG 时遇到了一个奇怪的问题。基本上我想做的是创建一个动态磁贴,我可以使用后台代理(以及从应用程序本身内部)更新它。
我已经按照这篇博文中的步骤进行了操作,这些步骤在我创建磁贴时非常有用;我有一个自定义的用户控件,上面有一些文本块,它作为 JPG 保存到独立存储中,正如帖子所说。
创建图块没有问题 - UserControl 被很好地呈现,因为它应该是。但是,当我尝试更新磁贴时(使用完全相同的方法 - 将新控件保存为 JPG,然后使用该 JPG 作为 BackgroundImage),事情就崩溃了。
放置在图块上(并保存在独立存储中)的结果图像如下所示:压扁图块(使用独立存储资源管理器工具从独立存储中拉出)
背景是黑色的,所有文字都沿着图像的一侧向下延伸(并相互重叠)——预期的结果是背景是手机的强调色,而文字在顶部附近水平显示。
用于生成和保存图像的代码在两个实例中完全相同——我已将其抽象为一个静态方法,该方法返回StandardTileData
. 唯一的区别是从哪里调用它:在创建磁贴的工作情况下,它是从主应用程序中的页面调用的;在非工作情况下(更新磁贴),它是从只能通过磁贴本身的深层链接访问的页面调用的。
有什么想法吗?我猜想将控件渲染为 JPG 时出了点问题,因为实际图像是以这种方式出现的。
生成图像的代码片段在这里:
StandardTileData tileData = new StandardTileData();
// Create the Control that we'll render into an image.
TileImage image = new TileImage(textA, textB);
image.Measure(new Size(173, 173));
image.Arrange(new Rect(0, 0, 173, 173));
// Render and save it as a JPG.
WriteableBitmap bitmap = new WriteableBitmap(173, 173);
bitmap.Render(image, null);
bitmap.Invalidate();
IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication();
String imageFileName = "/Shared/ShellContent/tile" + locName + ".jpg";
using (IsolatedStorageFileStream stream = storage.CreateFile(imageFileName))
{
bitmap.SaveJpeg(stream, 173, 173, 0, 100);
}
tileData.BackgroundImage = new Uri("isostore:" + imageFileName, UriKind.Absolute);
return tileData;
我要转换的控件的 XAML 在这里:
<UserControl x:Class="Fourcast.TileImage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
d:DesignHeight="173" d:DesignWidth="173" FontStretch="Normal" Height="173" Width="173">
<Border Background="{StaticResource PhoneAccentBrush}">
<StackPanel>
<TextBlock HorizontalAlignment="Stretch"
TextWrapping="Wrap" VerticalAlignment="Stretch" Style="{StaticResource PhoneTextLargeStyle}" x:Name="Temperature"></TextBlock>
<TextBlock x:Name="Condition" HorizontalAlignment="Stretch"
TextWrapping="Wrap" VerticalAlignment="Stretch" Style="{StaticResource PhoneTextNormalStyle}">
</TextBlock>
</StackPanel>
</Border>
</UserControl>
更新:在使用调试器进行一些调查之后,当从更新磁贴的类调用该方法时,似乎调用Measure
并且Arrange
似乎没有做任何事情。但是,在创建磁贴时,这些调用按预期运行(控件的 ActualWidth 和 ActualHeight 更改为 173)。