2013-01-03 4 views
8

CycleTileの動作例をいくつか見てきましたが、これらはすべてローカルイメージを使用しています。アプリを最初に実行し、CycleTileをリモートイメージに向けると、これらのイメージを設定することは可能ですか?または、これらを電話に保存する必要がある場合、CycleTileを参照するにはどうすればよいですか?CycleTileをリモートイメージで作成する

答えて

21

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

次に、我々は/共有/」IsoStoreに9枚の画像をダウンロードします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), 
      } 
     }); 
} 

考慮すべき興味深い物事のカップルがあります:それはMutex.WaitAllを活性化するとき、タイマーthreseholdを追加しても意味がとている場合がありますので、

  1. 定期的なバックグラウンドエージェントは、その動作を完了するまでに25秒を持っていますそれは優雅に失敗する。
  2. 25秒で9枚の画像をダウンロードすると、一部のネットワーク条件下で全く動作しないことがあるため、最適化するのが最適かもしれません。少ない画像を使用することも、30分ごとに少数の画像のみを更新することもできます。
  3. CycleTileDataを同じファイルURIに更新すると、タイル(AFAIK)の更新がトリガーされません。ですから、myImage0よりも良いファイル名が必要ですが、画像の一意のファイル名が必要です。
+4

ダウンロードにバックグラウンドファイル転送を使用することをお勧めします。非常に信頼性が高く、25秒の制限には制約はありません。 –

+0

マティス推奨+1。いいですよ。 – JustinAngel

2

CycleTileの場合、画像はローカルである必要があります。あなたはperiodic taskを設定して画像を更新し、それらの画像をローカル/隔離されたストレージ(例えば、ms-appdata:///local/shared/shellcontent/image01.png)内の共有/シェルの特別なフォルダに保存することができます。

Session 7 of the Windows Phone 8 Jumpstartこのために良いリファレンスです - で、具体的には約25:30

関連する問題