C# 创建ShellTile图像问题

C# 创建ShellTile图像问题,c#,windows-phone-8,C#,Windows Phone 8,我正在尝试使用xaml控件和可写位图创建图像。我想说,大约95%的时间它在应用程序运行时工作正常,但在调度任务中还没有看到它失败。当它确实失败时,它创建的图像是奇怪的。所有元素均与左上角对齐,背景为黑色(颜色应为画笔)。我尝试了很多方法来解决这个问题,但是我迷路了。我能复制这个问题的唯一方法是,如果我不调用度量和安排。下面是代码,有什么想法吗 Deployment.Current.Dispatcher.BeginInvoke(() => { TileHelper.UpdateFli

我正在尝试使用xaml控件和可写位图创建图像。我想说,大约95%的时间它在应用程序运行时工作正常,但在调度任务中还没有看到它失败。当它确实失败时,它创建的图像是奇怪的。所有元素均与左上角对齐,背景为黑色(颜色应为画笔)。我尝试了很多方法来解决这个问题,但是我迷路了。我能复制这个问题的唯一方法是,如果我不调用度量和安排。下面是代码,有什么想法吗

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;
}

问题是因为您在控件中使用了网格,网格的布局可能需要比不在页面中时更多的过程。(我怀疑这是由于框架内部某个地方的竞争条件造成的。)

有两种方法可以解决此问题:

  • 不需要在XAML中使用网格
  • 在调用
    tile.Measure()
    tile.Arrange()之后调用
    UpdateLayout()

  • 这篇文章()上的图片看起来像我的。但是,我现在在ViewModel中调用它,一旦数据得到更新。我最近将其移动到ViewModel。它最初在OnNavigatedToOverride中,在单击按钮时创建互动程序时也存在问题。正如您所述,我使用了网格,我昨天在您所述的地方实际实现了UpdateLayout,目前为止效果良好。我通常可以让它在快速退出应用程序时出错,并且在更改后还没有看到问题。谢谢