0

xaml コントロールと書き込み可能なビットマップを使用してイメージを作成しようとしています。アプリの実行中は約 95% の確率で正常に動作し、スケジュール タスクで失敗したことはまだありません。失敗すると、作成されるイメージは奇妙になります。すべての要素は、黒の背景で左上隅に配置されます (色は PhoneAccentBrush である必要があります)。これを修正するために多くのことを試みましたが、迷っています。問題を再現できる唯一の方法は、Measure と Arrange を呼び出さないことです。以下はコードですが、何かアイデアはありますか?

Deployment.Current.Dispatcher.BeginInvoke(() =>
{
    TileHelper.UpdateFlipTile(this.LiveTile, this.Facility, this.METARs[0]);
});

public static void UpdateFlipTile(ShellTile shellTile, Facility facility, METAR metar)
{
    /*removed some variables to shorten code*/

    WriteableBitmap mediumImage = TileHelper.CreateMediumTileImage(facility.Description, metar.flight_category, wind, TileHelper.GetUri(metar), temp, metar.observation_time);
    SaveImage(mediumImageFileName, mediumImage);            

    FlipTileData flipTile = new FlipTileData()
    {
        Title = "",
        BackTitle = "",
        BackContent = "",
        WideBackContent = "",
        BackgroundImage = new Uri("isostore:/Shared/ShellContent/" + siteNumberEncoded + ".jpg", UriKind.Absolute)
    };

        shellTile.Update(flipTile);
    }
}

private static WriteableBitmap CreateMediumTileImage(string airport, string flightCategory, string wind, Uri imageUri, string temp, string lastUpdated)
{
    MediumMetarTile tile = new MediumMetarTile(airport.ToLower(), wind, flightCategory, temp, lastUpdated, imageUri);           
    tile.Measure(new Size(336, 336));
    tile.Arrange(new Rect(0, 0, 336, 336));

    WriteableBitmap image = new WriteableBitmap(336, 336);
    image.Render(tile, null);
    image.Invalidate();

    System.Diagnostics.Debugger.Log(0, "TileHelper.CreateMediumTileImage", "medium tile image created");
    return image;
}
4

1 に答える 1

0

この問題は、コントロールで Grid を使用しており、グリッドのレイアウトが、ページの一部ではない場合よりも多くのパスを必要とする可能性があるためです。(これは、フレームワークの内部のどこかで競合状態になっていると思われます。)

これを回避するには、次の 2 つの方法があります。

  1. XAML でのグリッドの必要性を取り除く
  2. UpdateLayout()との両方の呼び出しの後tile.Measure()tile.Arrange()呼び出します
于 2013-10-23T12:36:40.683 に答える