Enumerare risorse e contenuti inclusi all’interno di un’applicazione Windows Phone 7

Scritto da  Marco Amendola il lunedì 22 novembre 2010  •  Linguaggio: C#   • Livello: 100


All'interno di un applicazione WP7 le risorse aggiuntive (ad es. immagini o suoni) possono essere incluse con due modalità di compilazione: Resource e Content.
La prima include gli elementi all'interno dell'assembly dell'applicazione (il quale a sua volta è contenuto all'interno del pacchetto Xap, che è in sostanza uno Zip), mentre la seconda inserisce gli elementi nello Xap, a fianco del'assembly principale e delle eventuali librerie referenziate nel progetto.

La seconda modalità è da preferire in quanto riduce la dimensione dell'assembly, migliorando il tempo di caricamento. Inoltre alcuni controlli (ad es. l'Application Bar) richiedono che le relative icone siano compilate come Content.

Per gli elementi compilati come "Resource", l'URI da utilizzare per la lettura è nella forma: /My.Assembly;component/Path/To/ImageFile.ext
Se invece gli elementi inclusi sono compilati come "Content", gli URI relativi sono nella forma: /Path/To/ImageFile.ext

Mentre l'accesso diretto ai singoli elementi è piuttosto semplice, conoscendone il nome e il path, l'enumerazione non lo è altrettanto.

Per enumerare gli elementi Resource è possibile utilizzare la classe ResourceManager; di seguito un esempio:

IEnumerable<Uri> GetAllImageUrisInternal()
{
var assembly = Assembly.GetExecutingAssembly();
var assemblyName = assembly.FullName;
assemblyName = assemblyName.Remove(assemblyName.IndexOf(","));
ResourceManager rm = new ResourceManager(assemblyName + ".g", assembly);

//HACK: senza questo primo accesso l'enumerazione sembra fallire
using (Stream stm = rm.GetStream("app.xaml")) { }

var entries = new DictionaryEntry[]{};
using (ResourceSet rs = rm.GetResourceSet(Thread.CurrentThread.CurrentUICulture, false, true)) {
entries = rs.Cast<DictionaryEntry>().ToArray();
}

foreach (var entry in entries)
{
var key = entry.Key.ToString();
if (key.StartsWith("resources/images/")) //qui è possibile filtrare le risorse di interesse in base al nome e al path
yield return new Uri(string.Format("/{0};component/{1}", assemblyName, key),UriKind.RelativeOrAbsolute);
}
}

 

Per enumerare gli elementi inclusi come Content, invece, non conosco una soluzione che consenta di ispezionare il pacchetto Xap direttamente dall'applicazione.

E' però possibile includere nello Xap un file di testo contenente un elenco degli elementi inclusi (una sorta di indice).
Accedendo a questo file, che deve avere ovviamente un nome noto, è possibile ricostruire l'elenco dei Content.
Per non dover manutenere manualmente l'elenco è possibile aggiungere nel file di progetto .csprj (che descrive il processo di build) un piccolo task MSBuild che scrive l'elenco dei "Content" in un file di testo:

<Target Name="BeforeBuild">
<WriteLinesToFile File="Resources\ContentList.txt" Lines="@(Content)" Overwrite="true" Encoding="Unicode"/>
</Target>

 

Questo "step" sarà eseguito automaticamente prima di ogni compilazione, in modo che l'elenco sia sempre allineato ai contenuti correnti del progetto.


Tags: wp7,resource,content,xap

 
x