CycleTileの動作を示す例をいくつか見てきましたが、これらはすべてローカル画像を使用しています。アプリを最初に実行した後でこれらの画像を設定し、CycleTileをリモート画像にポイントすることは可能ですか?または、最初にこれらを電話に保存する必要がある場合、CycleTileにそれらを参照させるにはどうすればよいですか?
2 に答える
CycleTileTemplateとCycleTileDataは、ローカルURIのみをサポートし、リモートWebURIはサポートしません。つまり、サイクルイメージのソースは、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よりも優れたファイル名が必要になりますが、画像には一意のファイル名が必要です。
CycleTileの場合、画像はローカルである必要があります。ただし、定期的なタスクを設定して画像を更新し、それらの画像をローカル/分離ストレージの共有/シェルコンテンツ特別フォルダーに保存することもできます(例:ms-appdata:///local/shared/shellcontent/image01.png)
Windows Phone 8ジャンプスタートのセッション7は、このための良いリファレンスです。具体的には、約25:30インチです。