2009-05-13 6 views
34

Mon assembly inclut une image avec BuildAction == Resource. Je veux obtenir un bitmapImage à partir de cette ressource incorporée.Comment puis-je obtenir une image BitmapImage à partir d'une ressource?

Je peux charger un fichier de BitmapImage comme ceci:

var bitmap = new BitmapImage(new Uri(path)); 

Mais comment je créer un Uri qui référence à une image de ressource incorporée?

Lorsque je tente de créer un 'pack URI' (par exemple pack://application:,,,/MyImage.png ou pack://application:,,,/MyAssembly;component/MyImage.png), une exception est levée:

System.UriFormatException « URI non valide: Un port était attendu en raison de il y a deux points (':') présent mais le port n'a pas pu être analysé. "

Je trouve le correctif, la UriFormatException dans ce blog post

Cependant, avec ce correctif appliqué, je reçois toujours des exceptions en essayant de charger un BitmapImage d'un URI paquet. Lorsque j'utilise le format pack://application:,,,/Image.png, j'obtiens une exception NullReferenceException et lorsque j'utilise le format pack://application:,,,/AssemblyName;component/Image.png, j'obtiens une exception NotSupportedException "Le préfixe Uri n'est pas reconnu".


Résumé Mon problème était que je tentais d'utiliser un « pack URI » dans un processus avant tout contrôle WPF/fenêtre/etc avait été instancié, de sorte que le schéma d'URI « pack » n'a pas encore registered (l'autre WPF requis 'stuff' ne doit pas non plus être paramétré, car l'enregistrement manuel du pack ne résout pas lui-même le problème). La solution consistait à attendre après l'instanciation de mon contrôle utilisateur WPF pour utiliser les URI pack.

+1

Merci pour votre résumé du problème. J'ai le même problème et j'essaierai de le contourner comme vous le suggérez. – Oskar

+0

duplication possible de [Chargement de BitmapImage dans le code] (http://stackoverflow.com/questions/801833/loading-bitmapimage-in-code) –

Répondre

20

This MSDN page a toutes les informations que vous voulez savoir sur les URIs des ressources en WPF (pack de URIs souvent appelés). Vous allez vouloir utiliser URI relatives plus souvent probablement, alors voir Tableau 4, qui devrait être d'une utilisation particulière.

Si vous voulez un aperçu de URIs de brève des ressources (pack), voir this blog post. Il montre que la syntaxe est en effet relativement simple:

pack://application:,,,/ResourceFile.xaml 

pack://application:,,,/ReferencedAssembly;component/ResourceFile.xaml 

Cependant, il y a quelques bizarreries de travailler (dans mon expérience), afin de trouver souvent la ressource correcte URI nécessite un peu d'expérimentation.

+1

@mackenir: Avez-vous déjà considéré que l'URL que vous avez publiée dans votre * édition * question n'était pas encore apparu au moment où j'ai écrit ma réponse. L'impolitesse ne va pas vous donner une bonne réponse. – Noldorin

+1

Désolé! J'ai oublié que j'avais édité la question, croyez-le ou non. – mackenir

+1

@mackenir: Pas de soucis, dans ce cas. Avez-vous essayé simplement d'utiliser un URI relatif, aa montré dans le tableau 4 sur la page MSDN? Vous pourriez avoir plus de chance avec ça ... – Noldorin

Questions connexes