J'essaie de définir la source d'une image WPF dans le code. L'image est intégrée en tant que ressource dans le projet. En regardant des exemples, j'ai trouvé le code ci-dessous. Pour une raison quelconque, cela ne fonctionne pas - l'image ne s'affiche pas.
En déboguant, je peux voir que le flux contient les données d'image. Alors, qu'est-ce qui ne va pas?
Assembly asm = Assembly.GetExecutingAssembly();
Stream iconStream = asm.GetManifestResourceStream("SomeImage.png");
PngBitmapDecoder iconDecoder = new PngBitmapDecoder(iconStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
ImageSource iconSource = iconDecoder.Frames[0];
_icon.Source = iconSource;
L'icône est définie quelque chose comme ceci: <Image x:Name="_icon" Width="16" Height="16" />
<Image Source="some_fully_qualified_path">
le XAML n'échoue jamais.Réponses:
Après avoir eu le même problème que vous et avoir fait quelques lectures, j'ai découvert la solution - Pack URIs .
J'ai fait ce qui suit dans le code:
Ou plus court, en utilisant un autre constructeur BitmapImage:
L'URI est divisé en plusieurs parties:
application:///
Chemin: nom d'un fichier de ressources compilé dans un assembly référencé. Le chemin doit être conforme au format suivant:
AssemblyShortName[;Version][;PublicKey];component/Path
Les trois barres obliques
application:
doivent ensuite être remplacées par des virgules:Et bien sûr, assurez-vous de définir l'action de génération sur votre image
Resource
.la source
BitmapImage(Uri)
constructeur, ce qui évite d'avoir à appeler BeginInit et EndInit. Je l'ai ajouté ici.Cela chargera une image appelée "Untitled.png" dans un dossier appelé "Images" avec son "Build Action" défini sur "Resource" dans un assembly appelé "WpfApplication1".
la source
var uriSource = new Uri("Images/Untitled.png", UriKind.Relative);
serait suffisantC'est un peu moins de code et peut être fait sur une seule ligne.
la source
Très facile:
Pour définir dynamiquement l'image d'un élément de menu, procédez uniquement comme suit:
... alors que "icon.ico" peut être localisé partout (il se trouve actuellement dans le répertoire 'Resources') et doit être lié en tant que Resource ...
la source
Vous pouvez également réduire cela à une seule ligne. C'est le code que j'ai utilisé pour définir l'icône de ma fenêtre principale. Il suppose que le fichier .ico est marqué comme contenu et qu'il est copié dans le répertoire de sortie.
la source
Manière la plus simple:
la source
As-tu essayé:
la source
C'est mon chemin:
Usage:
la source
Voici un exemple qui définit dynamiquement le chemin de l'image (image située quelque part sur le disque plutôt que de créer en tant que ressource):
Réflexions sur les icônes ...
À première vue, vous penseriez que la propriété Icon ne peut contenir qu'une image. Mais il peut en fait contenir n'importe quoi! J'ai découvert cela par accident lorsque j'ai essayé par programme de définir la
Image
propriété directement sur une chaîne avec le chemin d'accès à une image. Le résultat était qu'il ne montrait pas l'image, mais le texte réel du chemin!Cela conduit à une alternative pour ne pas avoir à créer une image pour l'icône, mais utiliser du texte avec une police de symbole à la place pour afficher une simple "icône". L'exemple suivant utilise la police Wingdings qui contient un symbole "floppydisk". Ce symbole est vraiment le caractère
<
, qui a une signification particulière en XAML, nous devons donc utiliser la version encodée à la<
place. Cela fonctionne comme un rêve! Voici un symbole de disquette sous forme d'icône sur l'élément de menu:la source
Si votre image est stockée dans un ResourceDictionary, vous pouvez le faire avec une seule ligne de code:
la source
Il existe également un moyen plus simple. Si l'image est chargée en tant que ressource dans le XAML et que le code en question est le code-behind pour ce contenu XAML:
la source
Mettez le cadre dans un VisualBrush:
Mettez le VisualBrush dans GeometryDrawing
Maintenant, placez le GeometryDrawing dans une DrawingImage:
Placez-le sur votre source d'image, et voilà!
Vous pourriez cependant le faire beaucoup plus facilement:
Et en code:
la source
Il existe également un moyen plus simple. Si l'image est chargée en tant que ressource dans le XAML et que le code en question est le code derrière pour ce XAML:
Voici le dictionnaire de ressources pour un fichier XAML - la seule ligne qui vous intéresse est l'ImageBrush avec la clé "PosterBrush" - le reste du code est juste pour montrer le contexte
Maintenant, dans le code derrière, vous pouvez simplement le faire
la source
Comment charger une image depuis des icônes de ressources et des images (version corrigée d'Arcturus):
Supposons que vous souhaitiez ajouter un bouton avec une image. Que devrais tu faire?
Il est maintenant temps de charger notre image en XAML
Terminé.
la source
Je suis nouveau sur WPF, mais pas en .NET.
J'ai passé cinq heures à essayer d'ajouter un fichier PNG à un «projet de bibliothèque de contrôles personnalisés WPF» dans .NET 3.5 (Visual Studio 2010) et à le définir comme arrière-plan d'un contrôle hérité d'une image.
Rien de relatif avec les URI n'a fonctionné. Je ne peux pas imaginer pourquoi il n'y a pas de méthode pour obtenir un URI à partir d'un fichier de ressources, via IntelliSense, peut-être comme:
J'ai essayé beaucoup d'URI et joué avec ResourceManager et les méthodes GetManifest de l'assembly, mais il y avait toutes des exceptions ou des valeurs NULL.
Ici, je mets le code qui a fonctionné pour moi:
la source
Si vous avez déjà un flux et connaissez le format, vous pouvez utiliser quelque chose comme ceci:
la source
Vous venez de manquer un peu.
Pour obtenir une ressource intégrée à partir de n'importe quel assembly, vous devez mentionner le nom de l'assembly avec votre nom de fichier comme je l'ai mentionné ici:
la source