J'ai une image dans une application C # WPF dont l'action de génération 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 via la boîte de dialogue des propriétés de glisser/déposer. J'essaie de l'écrire en tant que flux, mais je ne peux pas l'ouvrir malgré avoir essayé pas mal de variations de points, de barres obliques, d'espaces de noms et apparemment tout le reste.
Je peux y accéder pour l'utiliser ailleurs dans xaml avec "pack: // application: ,/Resources/images/flags/tr.png", mais je ne peux pas accéder à un flux le contenant.
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();
}
Avec qui je n'ai pas eu de chance.
GetManifestResourceStream est destiné aux ressources .NET traditionnelles, c'est-à-dire celles référencées dans les fichiers RESX. Ce ne sont pas les mêmes que les ressources WPF, c'est-à-dire celles ajoutées avec une action de génération de Resource. Pour y accéder, vous devez utiliser Application.GetResourceStream , en passant dans le pack approprié: URI. Cela renvoie un objet StreamResourceInfo, qui possède une propriété Stream pour accéder aux données de la ressource.
Vous recherchez probablement Application.GetResourceStream
StreamResourceInfo sri = Application.GetResourceStream(new Uri("Images/foo.png"));
if (sri != null)
{
using (Stream s = sri.Stream)
{
// Do something with the stream...
}
}
Si je vous comprends bien, vous avez un problème pour ouvrir le flux de ressources, car vous ne connaissez pas son nom exact? Si oui, vous pouvez utiliser
System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames()
pour obtenir une liste des noms de toutes les ressources incluses. De cette façon, vous pouvez trouver le nom de la ressource qui a été attribué à votre image.
Il n'est pas nécessaire d'appeler la méthode Close (), elle sera automatiquement appelée par Dispose () à la fin de la clause using. Votre code pourrait donc 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);
}
}