Enumerare risorse e contenuti inclusi all’interno di un’applicazione Windows Phone 7
Scritto da
Marco Amendola il
lunedì 22 novembre 2010
•
Linguaggio:
• 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