2013-01-03 7 views
8

Ho visto un certo numero di esempi che mostrano il CycleTile in azione, ma tutti hanno usato immagini locali. È possibile impostare queste immagini una volta che l'app è stata eseguita per la prima volta e indirizzare CycleTile alle immagini remote? O se ho bisogno di salvarli prima sul telefono, come posso far riferimento a CycleTile?Creazione di CycleTile con immagini remote

risposta

21

CycleTileTemplate & CycleTileData supportano solo URI locali e non supportano URI web remoti.. Ciò significa che puoi impostare la sorgente di un'immagine del ciclo solo da file installati da XAP o da file in IsoStore.

Per supportare immagini remote in CycleTileData, è necessario scaricare le immagini in un agente di background periodico, salvarle in IsoStore e quindi aggiornare CycleTileData con tali immagini. Le notifiche push non funzioneranno qui poiché le immagini devono essere locali e neanche ShellTileSchedule.

Assicurarsi di salvare le immagini su IsoStore sotto "/ Shared/ShellContent" e impostare gli URI come "isostore: /Shared/Shellcontent/myImage.png" o non saranno accessibili ai riquadri della schermata iniziale.

Vediamo un esempio. Prima iniziamo scrivendo su un algoritmo filettato parallelizzato che lancia 9 discussioni scaricare, attende i risultati e aggiorna piastrelle:

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

Avanti, faremo scaricare le immagini in 9 IsoStore "/ Shared/ShellContent". Prenderemo nota speciale per aggiungere i nuovi flag di threading per ogni download Web e impostare il flag come fatto una volta che il file si trova in 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); 
    } 
} 

Infine, aggiorneremo il riquadro live per utilizzare le nuove immagini in 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), 
      } 
     }); 
} 

Ci sono un paio di cose interessanti da considerare:

  1. periodiche agenti in background hanno solo 25 secondi per completare il loro funzionamento, quindi potrebbe avere senso per aggiungere timer thresehold quando si attiva Mutex.WaitAll e hanno fallisce con grazia.
  2. Il download di 9 immagini in 25 secondi potrebbe non funzionare affatto in alcune condizioni di rete, quindi potrebbe essere meglio ottimizzarlo. Puoi utilizzare meno immagini o aggiornare solo poche immagini ogni 30 minuti.
  3. Aggiornamento di CycleTileData sullo stesso file Gli URI non attivano un aggiornamento del riquadro (AFAIK). Quindi avrai bisogno di nomi di file migliori di myImage0, ma preferisci avere nomi di file univoci per le immagini.
+4

Suggerisco di utilizzare i trasferimenti di file in background per i download, molto affidabili e non si vincola al limite di 25 secondi. –

+0

+1 su raccomandazione matthijs. Buona chiamata – JustinAngel

2

Per CycleTile, le immagini devono essere locali. È possibile impostare un periodic task per aggiornare le immagini, quindi archiviare tali immagini nella cartella speciale condivisa/shellcontent nella memoria locale/isolata (ad esempio, ms-appdata: ///local/shared/shellcontent/image01.png)

Session 7 of the Windows Phone 8 Jumpstart è un buon riferimento per questo - specificamente circa 25:30 in

Problemi correlati