2011-09-17 23 views
5

Incluyo una serie de imágenes como "Contenido" en mi XAP desplegado para Mango.¿Cómo enumerar las imágenes incluidas como "Contenido" en el XAP?

Me gustaría enumerar estos en tiempo de ejecución - ¿hay alguna manera de hacerlo?

He intentado enumerar los recursos como:

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

Pero las imágenes no están incluidos en la lista. También intenté usar recursos integrados, pero eso no ayudó. Puedo leer las transmisiones usando Application.GetResourceStream(uri), pero obviamente necesito saber los nombres para poder hacer esto.

+0

¿Podría aclarar el propósito de hacer esto? –

+0

En este caso particular, son aproximadamente un centenar de iconos que quiero precachear en la memoria.No lo sé, pero sospecho que esto ayudará con un problema de rendimiento que estoy viendo. En un caso anterior (una rama de iron7), quería cargar un directorio lleno de scripts de ruby ​​al inicio. En ambos casos, podría codificar las listas en C#, pero preferiría evitar esto si hubiera una manera - sería genial si pudiera enumerar lo que se agregue a la carpeta) – Stuart

+0

No creo que puedas gana cualquier incremento de rendimiento notable desde "precargarlos". Tener un tipo de compilación para el contenido debe ser lo suficientemente rápido. Al menos es para todas mis aplicaciones. –

Respuesta

1

No hay forma de enumerar los archivos configurados como "Contenido".

Sin embargo, hay una manera de enumerar archivos en tiempo de ejecución, si configura sus archivos como "Recurso incrustado".

Aquí es cómo se puede hacer esto:

  1. Establecer la Acción de generación de imágenes como "Recurso incrustado".
  2. Uso Assembly.GetCallingAssembly().GetManifestResourceNames() a enumerar los nombres de recursos
  3. Use Assembly.GetCallingAssembly().GetManifestResourceStream(resName) para obtener los flujos de archivos.

Aquí está el código:

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: Como se ha señalado Quetzalcóatl, el inconveniente de esta solución es que las imágenes están incrustadas en el archivo DLL, por lo que si un gran volumen de imágenes, la carga de la aplicación el tiempo puede tener un golpe.

+1

Sí, pero se olvidó de decirle al OA que lo que sugiere tiene un gran impacto negativo: EmbeddedResource hace que los archivos se INCOMODAN en la DLL resultante. Con "Contenido", se colocarán como archivos normales junto con la DLL. Por lo tanto, si convierte un gran volumen de archivos en "EmbeddedResource", su DLL crecerá significativamente y el tiempo de inicio se verá afectado. ¡El objetivo de usar "Contenido" es reducir el tamaño del módulo! Si bien no hay forma de enumerar el "contenido" en WP7 debido a restricciones de seguridad, es posible generar una lista durante el proceso de compilación y leer la lista en tiempo de ejecución. – quetzalcoatl

+0

Correcto, edité la respuesta para resaltar ese inconveniente. –

4

Esto no es API horneada en WP7 que le permite enumerar los contenidos del Xap. Necesita saber el nombre de los elementos de contenido antes de poder recuperarlos.

Probablemente hay algún código flotando en algún lugar que es capaz de oler el catálogo de Zip en el XAP, sin embargo, le recomiendo encarecidamente que no se moleste. En su lugar, incluya algún recurso razonable como un archivo Xml o ResourceDictionary que los enumere.

4

Al no haber encontrado una forma práctica de leer los archivos de contenido de un XAP, creo una lista en tiempo de diseño usando T4.

ver un ejemplo en https://github.com/mrlacey/phonegap-wp7/blob/master/WP7Gap/WP7Gap/MainPage.xaml.cs

Este parece ser el camino correcto a seguir como:
a) prefiero construir la lista una vez en tiempo de diseño en lugar de en cada teléfono que necesita el código.
y
b) Nunca debería estar compilando el XAP sin estar seguro de qué archivos estoy incluyendo de todos modos.

Además, es un paso manual para establecer la acción de compilación en todos los archivos, por lo que añadir un paso manual a "Ejecutar herramienta personalizada" una vez para cada compilación no es un problema para mí.

+1

Buen fragmento, gracias. – Echilon

Cuestiones relacionadas