2011-09-17 10 views
5

Includo un numero di immagini come "Contenuto" nel mio XAP distribuito per Mango.Come enumerare le immagini incluse come "Contenuto" in XAP?

Mi piacerebbe enumerarli in fase di runtime: esiste un modo per farlo?

Ho provato enumerare le risorse come:

foreach (string key in Application.Current.Resources.Keys) 
{ 
    Debug.WriteLine("Resource:" + key); 
} 

Ma le immagini non sono inclusi nella lista. Ho anche provato a utilizzare le risorse incorporate, ma questo non ha aiutato. Posso leggere i flussi usando Application.GetResourceStream(uri) ma ovviamente ho bisogno di conoscere i nomi per farlo.

+0

Potrebbe chiarire lo scopo per fare ciò? –

+0

In questo caso particolare, sono circa un centinaio di icone che voglio precache in memoria.Non lo so, ma ho il sospetto che questo mi aiuterà in un problema di prestazioni che sto vedendo. In un caso precedente (una propaggine di iron7), volevo caricare una directory piena di script ruby ​​all'avvio. In entrambi i casi, ho potuto hardcode gli elenchi in C#, ma preferirei evitare questo se c'è un modo - sarebbe bello se potessi semplicemente enumerare qualsiasi cosa venga aggiunto alla cartella) – Stuart

+0

Non penso che lo farai ottenere un notevole incremento delle prestazioni da "pre-caricarli". Avere un tipo di build per il contenuto dovrebbe essere abbastanza veloce. Almeno è per tutte le mie app. –

risposta

1

Non esiste alcun modo per enumerare i file impostati come "Contenuto".

Tuttavia, esiste un modo per enumerare i file in fase di runtime, se si impostano i file come "Risorsa incorporata".

Ecco come si può fare questo:

  1. impostare l'azione di costruzione delle immagini come "Risorsa incorporata".
  2. Usa Assembly.GetCallingAssembly().GetManifestResourceNames() per enumerare i nomi delle risorse
  3. Utilizzare Assembly.GetCallingAssembly().GetManifestResourceStream(resName) per ottenere i flussi di file.

Ecco il codice:

public void Test() 
    { 
     foreach (String resName in GetResourcesNames()) 
     { 
      Stream s = GetStreamFromEmbeddedResource(resName); 
     } 
    } 

    string[] GetResourcesNames() 
    { 
     return Assembly.GetCallingAssembly().GetManifestResourceNames(); 
    } 

    Stream GetStreamFromEmbeddedResource(string resName) 
    { 
     return Assembly.GetCallingAssembly().GetManifestResourceStream(resName); 
    } 

EDIT: Come osservato Quetzalcoatl, lo svantaggio di questa soluzione è che le immagini sono incorporati nella DLL, quindi se un elevato volume di immagini, il carico app il tempo potrebbe prendere un colpo.

+1

Sì, ma hai dimenticato di dire all'OA che la cosa che suggerisci ha un grande impatto negativo: EmbeddedResource fa sì che i file ottengano EMBEDDED nella DLL risultante. Con "Contenuto", sarebbero messi come normali file insieme alla DLL. Pertanto, se si attiva un volume elevato di file in "EmbeddedResource", la DLL aumenterà in modo significativo e il tempo di avvio ne risentirà. Il punto di usare "Contenuto" è rendere il modulo più piccolo! Sebbene non sia possibile enumerare il "contenuto" su WP7 a causa di restrizioni di sicurezza, è possibile generare un elenco durante il processo di compilazione e leggere l'elenco in runtime. – quetzalcoatl

+0

Esatto, ho modificato la risposta per evidenziare questo inconveniente. –

4

Questa API non è integrata in WP7 che consente di enumerare il contenuto di Xap. È necessario conoscere il nome degli elementi di contenuto prima di poterli recuperare.

Probabilmente c'è del codice che gira intorno a un punto in grado di annusare il catalogo Zip nell'XAP, tuttavia, vi consiglio caldamente di non disturbarvi. Includere invece alcune risorse sensibili come un file Xml o ResourceDictionary che li elenca.

4

Non avendo trovato alcun modo pratico per leggere i file di contenuto da un XAP, ho creato un elenco di questo tipo in fase di progettazione utilizzando T4.

vedere un esempio a https://github.com/mrlacey/phonegap-wp7/blob/master/WP7Gap/WP7Gap/MainPage.xaml.cs

Questo sembra il modo giusto per andare come:
a) preferirei creare l'elenco, una volta in fase di progettazione, piuttosto che su ogni telefono cellulare che ha bisogno il codice.
e
b) Non dovrei mai costruire l'XAP senza essere certo di quali file sto includendo comunque.

Inoltre è un passaggio manuale per impostare l'azione di generazione su tutti questi file, quindi aggiungere un passaggio manuale a "Esegui strumento personalizzato" una volta per ogni generazione non è un problema per me.

+1

Grande frammento, grazie. – Echilon

Problemi correlati