2009-06-16 6 views
4

Dans un projet Visual Basic, j'ai ajouté un fichier de ressources (resx) contenant un tas d'images.Comment obtenir les noms de toutes les ressources dans un fichier de ressources

Maintenant, je veux interroger les noms des images. Si j'ouvre le fichier resx dans la vue de concepteur dans l'IDE de Visual Studio et sélectionnez une image, la grille de propriétés me montre une propriété de nom (par défaut "nom de fichier sans extension mais peut être modifié)

J'ai une image créée à l'exécution et remplie avec les images du fichier de ressources.Pour pouvoir accéder à ces images avec la clé, je dois le définir

Mon code ressemble à ceci (tout codé en dur) :

Dim imagelist as new Imagelist 
imageList.Images.Add("A", My.Resources.MyImages.A) 
imageList.Images.Add("B", My.Resources.MyImages.B) 
imageList.Images.Add("C", My.Resources.MyImages.C) 
imageList.Images.Add("D", My.Resources.MyImages.D) 
imageList.Images.Add("E", My.Resources.MyImages.E) 
.... 
imageList.Images.Add("XYZ", My.Resources.MyImages.XYZ) 

Et je veux ce achive:

Dim imagelist as new ImageList 

For Each img in GetMeAllImagesWithNameFromMyResourceFile 
    imageList.Images.Add(img.Name, img.ImageFile) 
Next 

où Nom est une chaîne et un ImageFile System.Drawing.Bitmap

Répondre

8

Voir si cette partie du code aide. J'ai utilisé l'icône comme exemple, que vous devrez changer si vous utilisez Bitmap.

EDIT: Vous devrez utiliser la référence de dictEntry.Value & voir comment il peut être utilisé pour l'ajouter à imagelist.

+0

Fonctionne très bien, exactement ce que je voulais. Juste 2 petits changements: Premièrement: le second paramètre de GetResourceSet doit être vrai (pour obtenir une référence même si la ressource n'a pas encore été chargée). Deuxièmement: Icon.GetType() ne fonctionnera pas parce que vous ne l'avez pas instancié, il devrait être GetType (Icon) à la place. Peut-être pourriez-vous éditer votre message pour corriger cela. –

+0

Si je me souviens bien, ce morceau de code fonctionne avec Icon.GetType(). Je vais le changer pour avoir GetType (Icon) selon votre suggestion. – shahkalpesh

+0

Cela fonctionnera dans un formulaire Windows, car vous avez une propriété Form1.Icon qui renvoie l'icône réelle du formulaire. Mais GetType (Icon) est la solution propre. –

0

Essayez quelque chose comme ceci:

Dim reader As New ResXResourceReader(resxFilePath) 

Dim en As IDictionaryEnumerator 
en = reader.GetEnumerator() 

While en.MoveNext() 
    Console.WriteLine("Resource Name: [{0}] = {1}", en.Key, en.Value) 
End While 

reader.Close() 

Vous pouvez trouver d'autres exemples qui pourraient vous aider à this link. Les exemples sont écrits en C#, mais il n'est pas très difficile de les modifier pour vb.net

+0

I Supposons qu'il veut charger des ressources intégrées. Le code ci-dessus fonctionne pour les fichiers RESX externes. –

1

Ce qui suit est écrit en C#, vous devriez être capable de traduire cela en VB facilement.

Assembly executingAssembly = GetExecutingAssembly(); 

foreach (string resourceName in executingAssembly.GetManifestResourceNames()) 
{ 
    Console.WriteLine(resourceName); 
} 

Maintenant que vous avez tous les noms de ressources, vous pouvez parcourir la liste et faire quelque chose comme:

foreach(string s in executingAssembly.GetManifestResourceNames()) 
{ 
    if (s.EndsWith(".bmp")) 
    { 
     imgStream = a.GetManifestResourceStream(s); 
     if (imgStream != null) 
     {      
      bmp = Bitmap.FromStream(imgStream) as Bitmap; 
      imgStream.Close(); 
     } 
    } 
} 

Je ne l'ai pas essayé, mais cela devrait fonctionner.

+0

GetManifestResourceNames énumère toutes mes ressources (par exemple, [WindowsApplication1.Images.resources | WindowsApplication1.Resources.resources | WindowsApplication1.Form1.resources]). Pas ce que je veux. –

0

Alors que les réponses ci-dessus m'a fait dans la bonne direction, j'ajoute une réponse distincte pour clarifier l'utilisation de GetResourceSet et le chargement ultérieur des images:

 Dim resSet As Resources.ResourceSet = My.Resources.ResourceManager.GetResourceSet(Globalization.CultureInfo.InvariantCulture, True, False) 
     For Each de As DictionaryEntry In resSet 
      If (de.Value.GetType() Is GetType(Bitmap)) Then 
       m_Icons.Add(de.Key, My.Resources.ResourceManager.GetObject(de.Key)) 
      End If 
     Next 

Notez les points suivants pour les arguments en My.Resources.ResourceManager. GetResourceSet:

  • utilisation de InvariantCulture
  • True est requis pour charger les ressources, car à ce stade de ma bibliothèque de classes, je n'ai pas encore accédé à l'ensemble de ressources et cela force le chargement.Cela semble être ce que @ bcrgen-Steinblock signifiait dans son commentaire, mais il a été mal compris dans la modification qui a suivi
  • faux est ok pour moi parce que je n'ai pas une ressource fallback/default définie
Questions connexes