Windows phone 8 使用远程映像创建CycleTile

Windows phone 8 使用远程映像创建CycleTile,windows-phone-8,Windows Phone 8,我已经看到了许多展示CycleTile运行的示例,但是这些都使用了本地图像。是否可以在应用程序首次运行后设置这些图像,并将CycleTile指向远程图像?或者,如果我确实需要先将这些图像保存到手机中,如何让CycleTile引用它们?对于CycleTile,图像必须是本地的。您可以设置刷新图像,然后将这些图像存储在本地/独立存储(例如ms)中的共享/shellcontent特殊文件夹中-appdata:///local/shared/shellcontent/image01.png) 这是一个很

我已经看到了许多展示CycleTile运行的示例,但是这些都使用了本地图像。是否可以在应用程序首次运行后设置这些图像,并将CycleTile指向远程图像?或者,如果我确实需要先将这些图像保存到手机中,如何让CycleTile引用它们?

对于CycleTile,图像必须是本地的。您可以设置刷新图像,然后将这些图像存储在本地/独立存储(例如ms)中的共享/shellcontent特殊文件夹中-appdata:///local/shared/shellcontent/image01.png)


这是一个很好的参考资料,特别是大约25:30英寸。

CycleTileTemplate和CycleTileData仅支持本地URI,不支持远程web URI。这意味着您只能从XAP安装的文件或IsoStore中的文件设置循环映像的源

为了支持CycleTileData中的远程映像,您需要在定期后台代理中下载映像,将其保存到IsoStore,然后使用这些映像更新CycleTileData。推送通知在这里不起作用,因为映像需要是本地的,ShellTileSchedule也不需要

确保将图像保存到“/Shared/ShellContent”下的IsoStore,并将其URI设置为“IsoStore:/Shared/ShellContent/myImage.png”,否则启动屏幕分幅将无法访问这些图像

让我们看一个例子。首先,我们编写一个并行线程算法,启动9个下载线程,等待结果,然后更新分幅:

private IsolatedStorageFile isoStore=IsolatedStorageFile.GetUserStoreForApplication();
已加载私有void主页(对象发送方、路由目标)
{
var threadFinishEvents=新列表();
下载图像(threadFinishEvents);
新线程(()=>
{
Mutex.WaitAll(threadFinishEvents.ToArray());
UpdateTiles();
isoStore.Dispose();
}).Start();
}
接下来,我们将把这9幅图片下载到IsoStore“/Shared/ShellContent”中。我们将特别注意为每个web下载添加新的线程标志,并在文件进入IsoStore后将标志设置为“完成”

private void下载图像(列出threadFinishEvents)
{
对于(int i=0;i<9;i++)
{
var localI=i;
var threadFinish=新的EventWaitHandle(错误,EventResetMode.ManualReset);
螺纹饰面通风口。添加(螺纹饰面);
var request=WebRequest.CreateHttp(“http://www.justinangel.net/storage/691x336.png");
request.BeginGetResponse(ir=>
{
var result=request.EndGetResponse(ir);
使用(var isoStoreFile=isoStore.OpenFile(“shared/shellcontent/myImage”+localI+”.png),
FileMode.Create,
FileAccess.ReadWrite)
使用(var response=result.GetResponseStream())
{
var-dataBuffer=新字节[1024];
while(response.Read(dataBuffer,0,dataBuffer.Length)>0)
{
写入(dataBuffer,0,dataBuffer.Length);
}
}
threadFinish.Set();
},空);
}
}
最后,我们将更新live tile以使用IsoStore中的新图像

private void updateiles()
{
ShellTile.ActiveTiles
.First()
.Update(新的CycleTileData()
{
Title=“周期性”,
CycleImages=新Uri[]
{
新Uri(“isostore:/Shared/ShellContent/myImage0.png”,UriKind.Absolute),
新Uri(“isostore:/Shared/ShellContent/myImage1.png”,UriKind.Absolute),
新Uri(“isostore:/Shared/ShellContent/myImage2.png”,UriKind.Absolute),
新Uri(“isostore:/Shared/ShellContent/myImage3.png”,UriKind.Absolute),
新Uri(“isostore:/Shared/ShellContent/myImage4.png”,UriKind.Absolute),
新Uri(“isostore:/Shared/ShellContent/myImage5.png”,UriKind.Absolute),
新Uri(“isostore:/Shared/ShellContent/myImage6.png”,UriKind.Absolute),
新Uri(“isostore:/Shared/ShellContent/myImage7.png”,UriKind.Absolute),
新Uri(“isostore:/Shared/ShellContent/myImage8.png”,UriKind.Absolute),
}
});
}
有两件有趣的事情需要考虑:

  • 定期后台代理只有25秒来完成其操作,因此在激活Mutex.WaitAll时添加计时器thresehold并使其正常失败可能是有意义的
  • 在某些网络条件下,在25秒内下载9个图像可能根本不起作用,因此最好对此进行优化。您可以使用较少的图像,或者每30分钟只更新几张图像
  • 将CycleTileData更新为相同的文件URI不会触发磁贴更新(AFAIK)。因此,您需要比myImage0更好的文件名,但图像的文件名应该是唯一的

  • 我建议使用后台文件传输进行下载,非常可靠,并且不受25秒限制。