瓷砖无法从隔离存储中获取图像

4
在我的WP7应用程序中,我正在生成一个图像,并将其保存在独立存储中以用于动态磁贴。然后,周期性任务可以使用该图像更新动态磁贴,这方面一切都正常。
但是,当我在前台WP7应用程序中创建动态磁贴图像时,我也会更新动态磁贴(因为我知道某些内容已更改,所以为什么要等待周期性任务)。但是,在此处进行动态磁贴更新时,似乎找不到新创建的文件,因此呈现的动态磁贴没有位图。
相关代码如下:
创建文件:
var source = new BitmapImage(new Uri("Images/Tiles/Class Timetable with T.png", UriKind.Relative));
source.CreateOptions = BitmapCreateOptions.None;
source.ImageOpened += (sender, e) => // This is important. The image can't be rendered before it's loaded.
{
    // Create our image as a control, so it can be rendered to the WriteableBitmap.
    var newImage = new Image();
    newImage.Source = source;
    newImage.Width = 173;
    newImage.Height = 173;

    // Define the filename for our tile. Take note that a tile image *must* be saved in /Shared/ShellContent
    // or otherwise it won't display.
    var tileImage = string.Format("/Shared/ShellContent/{0}.jpg", Event.UniqueId);

    // Define the path to the isolatedstorage, so we can load our generated tile from there.
    var isoStoreTileImage = string.Format("isostore:{0}", tileImage);

以及实际的保存操作本身

// Create a stream to store our file in.
var stream = store.CreateFile(tileImage);

// Invalidate the bitmap to make it actually render.
bitmap.Invalidate();

// Save it to our stream.
bitmap.SaveJpeg(stream, 173, 173, 0, 100);

// Close the stream, and by that saving the file to the ISF.
stream.Close();

这段代码实际上是获取图像并更新磁贴的,可以在定期任务中运行,但在应用程序本身中无法正常工作。

string imageString = "isostore:/Shared/ShellContent/" + nextEvent.UniqueId + ".jpg";
ShellTile defaultTile2 = ShellTile.ActiveTiles.First();
defaultTile2.Update(new StandardTileData
{
    Title = nextTime,
    BackgroundImage = (new Uri(imageString, UriKind.Absolute)),

});

我不确定自己是否在这里犯了一些基本错误?我正在考虑将生成的图像与其对象一起存储到数据库中。而且,在这里涉及的文件数量是可管理的。我没有生成大量的这些东西。

我有一个解决方法,就是从WP7应用程序内部更新livetile而不使用图像文件。


你是说它没有显示“BackgroundImage”,但“Title”已经更新了,对吗? - Claus Jørgensen
是的 - 标题在那里,但没有背景图片。 - Peter
2个回答

1

嘿,那段代码看起来很熟悉;-) 除此之外,在你发布的代码中没有任何可以确定问题的东西。

我猜测你在周期性任务中过早地调用了NotifyComplete()。为此,我建议你使用任务并行库来解决这个问题。

事实上,我今天早上刚写了一篇关于它的文章:如何:使用计划代理创建动态磁贴

关键部分是使用Task.ContinueWith确保在完成渲染背景图像并将其保存到隔离存储后才首先调用NotifyComplete()


是的 - 这是很好的代码 - 谢谢!我会审查你的文章,看看是否有帮助。 - Peter
如果您想快速检查此问题,只需注释掉 NotifyComplete() 并查看图像是否正确更新即可。 - Claus Jørgensen
我一直在研究这种方法,并开始按照这里的示例代码进行合并。如果可以,我有几个问题 - 首先,REST只是因为使用了Twitter Feed的示例而需要吗?还是在传递给UI线程时固有的?其次 - 使用这种方法,我是否仍然可以利用调试功能以更常规的方式启动定期任务操作 - 这非常方便。 - Peter
1)是的,我使用RestSharp从Twitter获取数据。您可以用任何类型的数据源替换它。 2)是的,不应该有任何阻止这样做的东西。 - Claus Jørgensen
我正在努力尝试将您的windcape示例适应到我的情况中。因为在那个示例中,您创建了一个初始任务作为获取Twitter Feed“client.ExecuteTask<List<Tweet>>(request)”过程的一部分...然而在我的情况下,我只是从数据库中填充一个小集合,并不知道如何创建初始任务,也不知道它如何包括我的集合。我认为一旦我有了这个,我就应该能够按照您的“RunOnUIThread”方法进行处理。但是该方法依赖于在其第一次调用时创建一个任务。 - Peter
我建议您花些时间学习正常的C#中TPL的工作原理。您需要了解异步代码如何工作才能处理Windows Phone平台。 - Claus Jørgensen

0

创建主应用程序内的路径时,不需要isostore:前缀。尝试仅创建文件的相对 URI。


当我使用isostore:前缀创建它时,周期性任务可以找到该文件,但主应用程序无法找到。如果我按照您的建议操作,周期性任务能否看到该文件? - Peter
2
“isostore:”前缀非常必要。这实际上是创建本地磁贴的原因。(他从我的博客文章中窃取了代码,所以我应该知道)而且,如果文件没有被创建,那么它就无法工作。 - Claus Jørgensen
因为我认为在没有使用isostore:前缀时,可能会出现问题。 - Peter
如果我使用isostore:前缀创建文件,为什么主应用程序会难以看到它呢?毕竟是应用程序刚刚创建了这个文件。 - Peter
是的,这些文件已经在编译时存在。他在运行时生成一个新图像,然后必须将其保存在隔离存储中。因此,磁贴的“BackgroundImage”必须以“isostore:”为前缀。 - Claus Jørgensen
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接