gpt4 book ai didi

windows-phone-8 - 使用远程图像创建CycleTile

转载 作者:行者123 更新时间:2023-12-04 04:57:30 24 4
gpt4 key购买 nike

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

最佳答案

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();

private void MainPage_Loaded(object sender, RoutedEventArgs e)
{
var threadFinishEvents = new List<WaitHandle>();

DownloadImages(threadFinishEvents);

new Thread(()=>
{
Mutex.WaitAll(threadFinishEvents.ToArray());

UpdateTiles();

isoStore.Dispose();
}).Start();
}

接下来,我们将9张图片下载到IsoStore“/Shared/ShellContent”中。我们将特别注意为每个Web下载添加新的线程标记,并在文件位于IsoStore中后将标记设置为完成。

private void DownloadImages(List<WaitHandle> threadFinishEvents)
{
for (int i = 0; i < 9; i++)
{
var localI = i;

var threadFinish = new EventWaitHandle(false, EventResetMode.ManualReset);
threadFinishEvents.Add(threadFinish);

var request = WebRequest.CreateHttp("http://www.justinangel.net/storage/691x336.png");
request.BeginGetResponse(ir =>
{
var result = request.EndGetResponse(ir);
using (var isoStoreFile = isoStore.OpenFile("shared/shellcontent/myImage" + localI + ".png",
FileMode.Create,
FileAccess.ReadWrite))
using (var response = result.GetResponseStream())
{
var dataBuffer = new byte[1024];
while (response.Read(dataBuffer, 0, dataBuffer.Length) > 0)
{
isoStoreFile.Write(dataBuffer, 0, dataBuffer.Length);
}
}

threadFinish.Set();
}, null);
}
}

最后,我们将更新实时磁贴以使用IsoStore中的新图像。

private void UpdateTiles()
{
ShellTile.ActiveTiles
.First()
.Update(new CycleTileData()
{
Title = "Cyclical",
CycleImages = new Uri[]
{
new Uri("isostore:/Shared/ShellContent/myImage0.png", UriKind.Absolute),
new Uri("isostore:/Shared/ShellContent/myImage1.png", UriKind.Absolute),
new Uri("isostore:/Shared/ShellContent/myImage2.png", UriKind.Absolute),
new Uri("isostore:/Shared/ShellContent/myImage3.png", UriKind.Absolute),
new Uri("isostore:/Shared/ShellContent/myImage4.png", UriKind.Absolute),
new Uri("isostore:/Shared/ShellContent/myImage5.png", UriKind.Absolute),
new Uri("isostore:/Shared/ShellContent/myImage6.png", UriKind.Absolute),
new Uri("isostore:/Shared/ShellContent/myImage7.png", UriKind.Absolute),
new Uri("isostore:/Shared/ShellContent/myImage8.png", UriKind.Absolute),
}
});
}

有几件有趣的事情要考虑:
  • 定期后台代理只有25秒才能完成其操作,因此在激活Mutex.WaitAll时添加计时器阈值可能会很有意义,并且会使其正常失败。
  • 在某些网络条件下,在25秒内下载9张图像可能根本不起作用,因此最好对此进行优化。您可以使用更少的图像,或者每30分钟仅更新几张图像。
  • 将CycleTileData更新为相同的文件URI不会触发图块(AFAIK)的更新。因此,与myImage0相比,您将需要更好的文件名,但是图像必须具有唯一的文件名。
  • 关于windows-phone-8 - 使用远程图像创建CycleTile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14149026/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com