0

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>

更新: デバッガーでいくつかの調査を行った後、タイルを更新しているクラスからメソッドが呼び出されたときに、への呼び出しが表示され、MeasureArrangeもしないようです。ただし、タイルが作成されると、これらの呼び出しは期待どおりに機能します (コントロールの ActualWidth と ActualHeight は 173 に変更されます)。

4

3 に答える 3

1

ここで何が起こっているのか正確にはわかりませんが、この問題を回避するために私がやったことは次のとおりです。

コントロールのレンダリングからStackPanel、コード内での定義、要素の追加、画像へのレンダリングに切り替えました。ただし、奇妙なことに、ArrangeandMeasureメソッドは、別の要素に適用されて呼び出されない限り、何も実行しません。UpdateLayout

結果の完全なコード(TextBlocksの内容と画像への書き込みを除く)は以下のとおりです。

StandardTileData tileData = new 

// None of this actually does anything, but for some reason the StackPanel
// won't render properly without it.
Border image = new Border();
image.Measure(new Size(173, 173));
image.Arrange(new Rect(0, 0, 173, 173));
image.UpdateLayout();
// End of function-less code.

StackPanel stpContent = new StackPanel();      

TextBlock txbTemperature = new TextBlock();
txbTemperature.Text = temperature;
txbTemperature.Style = (Style)Application.Current.Resources["PhoneTextLargeStyle"];
stpContent.Children.Add(txbTemperature);

TextBlock txbCondition = new TextBlock();
txbCondition.Text = condition;
txbCondition.Style = (Style)Application.Current.Resources["PhoneTextNormalStyle"];
stpContent.Children.Add(txbCondition);

stpContent.Measure(new Size(173, 173));
stpContent.Arrange(new Rect(0, 0, 173, 173));
于 2012-06-27T06:03:27.393 に答える
0

画像の背景に電話のアクセント カラーを使用する方法は、背景を透明にすることです。これには、JPG ではなく PNG を保存する必要があります。

出力画像は、すべてが必要以上にラッピングされているように見えます。おそらく、コントロールに含める要素の幅を調整する必要があります。XAML がなければ、より具体的にすることは困難です。

于 2012-06-25T11:39:08.043 に答える
0

また、この奇妙な動作も発生します-タイルがつぶれた(Ree7 Tileツールキットを使用)、

更新タイルを Dispatcher に呼び出してみます。

Deployment.Current.Dispatcher.BeginInvoke(() =>
{
    CustomTile tile = GetTile(card);
    StandardTileData tileData = tile.GetShellTileData();
    shellTile.Update(tileData);
});

私のために働く

于 2013-07-19T12:43:14.030 に答える