38 votes

Comment obtenir une image bitmap à partir d'une ressource ?

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

Je peux charger une image bitmap à partir d'un fichier comme suit :

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

Mais comment créer un Uri qui renvoie à une image ressource intégrée ?

Lorsque j'essaie de créer un fichier ' pack URI (par exemple pack://application:,,,/MyImage.png o 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é la solution à l'exception UriFormatException dans ce qui suit article de blog

Cependant, une fois cette correction appliquée, j'obtiens toujours des exceptions en essayant de charger une image BitmapImage à partir d'un URI de pack.

Lors de l'utilisation du pack://application:,,,/Image.png j'obtiens une NullReferenceException, et lorsque j'utilise le format pack://application:,,,/AssemblyName;component/Image.png j'obtiens une 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 qu'aucun contrôle WPF/fenêtre/etc n'ait été instancié, de sorte que le schéma URI "pack" n'était pas encore enregistré (d'autres "trucs" requis par WPF ne doivent pas non plus être définis, car l'enregistrement manuel du schéma "pack" ne résout pas le problème en soi). La solution consistait à attendre l'instanciation de mon usercontrol WPF pour utiliser les URI de pack.

1 votes

Merci pour votre résumé du problème. J'ai le même problème et je vais essayer de le contourner comme vous le suggérez.

0 votes

25voto

Noldorin Points 67794

Cette page MSDN contient toutes les informations sur les URI de ressources dans WPF (souvent appelés URI de pack). Vous voudrez utiliser URI relatifs plus souvent sans doute, donc voir Tableau 4 qui devrait être particulièrement utile.

Si vous souhaitez avoir une vue d'ensemble plus brève des URI de ressources (pack), voir cet article de blog . 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 à résoudre (d'après mon expérience), de sorte qu'il faut souvent expérimenter pour trouver l'URI de ressource correcte.

3 votes

@mackenir : N'avez-vous jamais pensé que l'URL que vous avez postée dans votre édité n'était pas encore apparue au moment où j'ai écrit ma réponse. L'impolitesse ne vous permettra pas d'obtenir une bonne réponse.

1 votes

@mackenir : Pas de souci, dans ce cas. Avez-vous essayé d'utiliser simplement un URI relatif, comme indiqué dans le tableau 4 de la page MSDN ? Vous aurez peut-être plus de chance avec cela...

0 votes

Je vais essayer les URI relatifs, mais je pense qu'ils peuvent être interprétés comme des chemins d'accès aux fichiers. Il semble qu'une chaîne de caractères qui est un chemin d'accès absolu soit interprétée comme tel, donc je pense qu'une chaîne de caractères simple sans schéma d'uri est considérée comme un chemin d'accès.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X