2009-09-07 4 views
27

J'ai une image dans une application C# WPF dont l'action de construction est définie sur 'Ressource'. C'est juste un fichier dans le répertoire source, il n'a pas été ajouté à la collection de ressources de l'application à travers la boîte de dialogue glisser/déposer les propriétés. J'essaye de l'écrire en tant que flux, mais je ne peux pas l'ouvrir en dépit d'essayer quelques variations de points, de barres obliques, d'espaces de noms et apparemment tout le reste.Ressource de l'assembly en tant que flux

Je peux y accéder pour utiliser ailleurs dans xaml avec "pack: // application: ,,,/Resources/images/flags/tr.png", mais je ne peux pas obtenir à un flux qui le contient.

La plupart des endroits semblent dire utiliser

using(BinaryReader reader = new BinaryReader(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("ResourceBlenderExpress.Resources.images.flags.tr.png"))) { 
    using(BinaryWriter writer = new BinaryWriter(File.OpenWrite(imageFile))) { 
     while((read = reader.Read(buffer, 0, buffer.Length)) > 0) { 
      writer.Write(buffer, 0, read); 
     } 
     writer.Close(); 
    } 
    reader.Close(); 
} 

Ce que je ne l'ai pas eu de chance avec.

Répondre

23

GetManifestResourceStream est pour les ressources .NET traditionnelles à savoir celles référencées dans resx. Ce ne sont pas les mêmes que les ressources WPF, c'est-à-dire celles ajoutées avec une action de construction de Resource. Pour y accéder, vous devez utiliser Application.GetResourceStream, en passant dans le pack approprié: URI. Cela retourne un objet StreamResourceInfo, qui a une propriété Stream pour accéder aux données de la ressource.

+0

Merci, je n'aurais jamais trouvé ça. :) – Echilon

1

Il n'est pas nécessaire d'appeler la méthode Close(), elle sera appelée automatiquement par Dispose() à la fin de la clause using. Donc, votre code pourrait ressembler à ceci:

using(BinaryReader reader = new BinaryReader(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("ResourceBlenderExpress.Resources.images.flags.tr.png"))) 
using(BinaryWriter writer = new BinaryWriter(File.OpenWrite(imageFile))) 
{ 
    while((read = reader.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     writer.Write(buffer, 0, read); 
    } 
} 
+0

Comment est-ce que cela répond à la question? –

+0

Vraiment? Un aperçu utile si c'est vrai. J'ai toujours pensé qu'il était préférable d'appeler Close pour les flux/fichiers. – Echilon

+0

L'utilisation de l'instruction Using appelle explicitement la méthode dispose du Stream qui appelle implicitement la méthode Close de celui-ci. De plus, l'instruction using dispose toujours de l'objet "used", même si une exception est levée, de sorte que l'utilisation est une instruction tout compris, presque sans faute. – BeardinaSuit

6

Si je vous ai droit, vous avez un problème pour ouvrir le flux de ressources, parce que vous ne connaissez pas son nom exact? Si oui, vous pouvez utiliser

System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames() 

pour obtenir une liste de noms de toutes les ressources incluses. De cette façon, vous pouvez trouver le nom de la ressource qui a été assigné à votre image.

+0

Pourquoi ne pas utiliser 'GetCallingAssembly' au lieu de' GetExecutingAssembly'? – Odys

25

Vous êtes probablement pour Application.GetResourceStream

StreamResourceInfo sri = Application.GetResourceStream(new Uri("Images/foo.png")); 
if (sri != null) 
{ 
    using (Stream s = sri.Stream) 
    { 
     // Do something with the stream... 
    } 
} 
+4

Pour ajouter, les fichiers doivent être créés en tant que "Ressource". http://stackoverflow.com/a/7394894/355264 –