web-dev-qa-db-fra.com

Comment puis-je obtenir une BitmapImage à partir d'une ressource?

Mon assemblage comprend une image avec BuildAction == Resource. Je veux obtenir un BitmapImage à partir de cette ressource intégrée.

Je peux charger une BitmapImage à partir d'un fichier comme celui-ci:

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

Mais comment créer un Uri qui fera référence à une image de ressource intégrée?

Lorsque j'essaie 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 la présence de deux points (':') mais le port n'a pas pu être analysé."

J'ai trouvé le correctif à l'exception UriFormatException dans ce article de blog

Cependant, avec ce correctif appliqué, je reçois toujours des exceptions en essayant de charger une BitmapImage à partir d'un URI de pack.

Lorsque vous utilisez le pack://application:,,,/Image.png format, j'obtiens une exception NullReferenceException, et lorsque j'utilise le pack://application:,,,/AssemblyName;component/Image.png format, j'obtiens une exception NotSupportedException "Le préfixe Uri n'est pas reconnu".


Résumé Mon problème était que j'essayais d'utiliser un 'pack URI' dans un processus avant que tout contrôle/fenêtre/etc WPF n'ait été instancié, donc le Le schéma d'URI "pack" n'était pas encore enregistré (les autres "éléments" requis par WPF ne doivent pas non plus être définis également, car l'enregistrement manuel du schéma de pack ne résout pas lui-même le problème). La solution était d'attendre après avoir instancié mon contrôle utilisateur WPF pour utiliser les URI des packs.

34
mackenir

Cette page MSDN contient toutes les informations que vous voudrez peut-être savoir sur les URI de ressources dans WPF (souvent appelés URI de pack). Vous allez vouloir utiliser URI relatifs plus souvent probablement, alors voyez Tableau 4 , qui devrait être de utilisation particulière.

Si vous voulez un aperçu plus bref des URI des ressources (pack), voir cet article de blog . Cela 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 à résoudre (selon mon expérience), si souvent trouver l'URI de ressource correcte nécessite un peu d'expérimentation.

20
Noldorin