UserControl を JPG として保存すると、奇妙な問題が発生します。基本的に、私がやりたいことは、バックグラウンド エージェントを使用して (およびアプリ自体から) 更新できるライブ タイルを作成することです。
このブログ投稿の手順に従いましたが、タイルを作成するときにうまく機能します。投稿が言うように、JPGとしてIsolatedStorageに保存されるいくつかのTextBlocksを持つカスタムUserControlがあります。
タイルの作成は問題ありません。UserControl は適切にレンダリングされます。ただし、タイルを更新しようとすると (まったく同じ方法を使用して、新しいコントロールを JPG として保存し、その JPG を BackgroundImage として使用して)、問題が発生します。
結果としてタイルに配置される (そしてIsolatedStorageに保存される) 画像は次のようになります。
背景は黒で、すべてのテキストが画像の側面に沿って伸びています (互いに重なっています)。想定される結果は、背景が電話のアクセント カラーであり、テキストが上部近くで水平に表示されることです。
画像を生成して保存するために使用されるコードは、両方のインスタンスでまったく同じです - を返す静的メソッドに抽象化しました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 に変更されます)。