2011-06-14 6 views
2

Ce que je veux faire semble très simple, et je l'ai fait sur d'autres plates-formes ...images de charge Dynamiquement dossier de projet - Windows Phone 7

Voici un contexte: Disons que vous avez 1000 petites images vous voulez afficher dans une liste de contrôle ListBox. Vous commencez par inclure les images de votre projet dans le dossier '/ images'. Vous définissez leur action de construction sur "Contenu".

Maintenant la question: Comment charger dynamiquement toutes ces images dans votre application lors de l'exécution? Par dynamique, je veux dire sans avoir à connaître chaque nom des 1000 images.

(Si vous pensez à IsolatedStorage, je l'ai essayé.Le dossier d'image fait partie de votre projet, mais n'est pas automatiquement chargé dans isolatedStorage, donc vous ne pouvez pas, autant que je sache, charger les images de IsolatedStorage)

+1

Les images ont-elles un nom ou sont-elles aléatoires? En outre, vous pouvez diffuser des images à partir du XAP dans votre stockage isolé si vous le souhaitez, mais peut-être inutile dans ce cas http://stackoverflow.com/questions/6244150/how-to-rename-an-image/6246037#comment- 7283927 – keyboardP

+1

J'aime cette suggestion, mais je ne connais pas les noms des images. Je suppose que vous pourriez dire qu'ils sont aléatoires. Il n'y a aucun modèle associé à la façon dont ils sont nommés. Ce que je cherche est quelque chose comme - Directory.GetFiles (/ images) ... qui permettrait d'énumérer tous les fichiers dans un répertoire donné; vous pouvez alors les charger tous à l'exécution ... Mais Directory.GetFiles est inhibé sur wp7 –

+0

Je ne pense pas qu'il existe un moyen d'itérer sur le fichier XAP sans connaître les noms de fichiers de contenu. Il ne peut pas non plus être modifié lors de l'exécution, vous devrez donc ajouter les images au moment de la compilation. Y at-il une raison pour laquelle vous ne serez pas en mesure de connaître les noms des images? N'a pas essayé ceci, mais vous pourriez placer toutes les images en tant que ressources et utiliser le ResourceManager. Cependant, cela augmentera le temps de chargement de l'application. – keyboardP

Répondre

6

Vous pouvez obtenir ce au moment de la conception avec le modèle T4 suivant:

<#@ template debug="false" hostspecific="true" language="C#" #> 
<#@ output extension=".gen.cs" #> 
<#@ import namespace="System.IO"#> 
// <auto-generated /> 
using Microsoft.Phone.Controls; 

namespace MyAppNamespace 
{ 
    public partial class MainPage : PhoneApplicationPage 
    { 
     private static string[] AllFilesInImagesFolder() 
     { 
      return new[] { 
<# 
      DirectoryInfo directoryInfo = new DirectoryInfo(Path.Combine(Path.GetDirectoryName(Host.TemplateFile), "images")); 

      foreach(FileInfo file in directoryInfo.GetFiles("*.*", SearchOption.AllDirectories)) 
      { 
       if (!file.FullName.Contains(@"\.")) 
       {#> 
          "<#= file.FullName.Substring(file.FullName.IndexOf("images")).Replace(@"\", "/") #>", 
<#    } 
      } 
#> 
         }; 
     } 
    } 
} 

Il générerons quelque chose comme:

// <auto-generated /> 
using Microsoft.Phone.Controls; 

namespace MyAppNamespace 
{ 
    public partial class MainPage : PhoneApplicationPage 
    { 
     private static string[] AllFilesInImagesFolder() 
     { 
      return new[] { 
          "images/image1.png", 
          "images/image2.png", 
          "images/image3.png", 
          "images/image4.png", 
          "images/image5.png", 
         }; 
     } 
    } 
} 

Yo Vous pouvez évidemment changer l'espace de nom et le nom de la classe partielle comme vous le souhaitez.

+0

Cela semble prometteur ... Je vais essayer plus tard aujourd'hui quand j'ai l'occasion. –

+2

Après m'être un peu renseigné sur les templates T4, cela a totalement fonctionné. Merci mec. http://msdn.microsoft.com/en-us/library/gg251242.aspx –

+0

Superbe. Comme Matt, je n'avais jamais entendu parler d'un template T4 mais c'était exactement ce dont j'avais besoin. Merci pour la description succincte, et merci de me présenter une toute nouvelle fonctionnalité. Les copieurs de code comme moi peuvent vouloir noter qu'il y a * deux * instances du pathname dans le code à modifier. :) –