364 Stimmen

Einstellen der WPF-Bildquelle im Code

Ich versuche, die Quelle eines WPF-Bildes im Code festzulegen. Das Bild ist als eine Ressource in das Projekt eingebettet. Durch das Betrachten von Beispielen habe ich mit dem unten stehenden Code kommen. Aus irgendeinem Grund funktioniert es nicht - das Bild wird nicht angezeigt.

Bei der Fehlersuche kann ich sehen, dass der Stream die Bilddaten enthält. Was ist also falsch?

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;

Das Symbol ist in etwa wie folgt definiert: <Image x:Name="_icon" Width="16" Height="16" />

463voto

Jared Harley Punkte 8061

Nachdem ich das gleiche Problem wie Sie hatte und etwas gelesen hatte, fand ich die Lösung - Pack URIs .

Im Code habe ich Folgendes getan:

Image finalImage = new Image();
finalImage.Width = 80;
...
BitmapImage logo = new BitmapImage();
logo.BeginInit();
logo.UriSource = new Uri("pack://application:,,,/AssemblyName;component/Resources/logo.png");
logo.EndInit();
...
finalImage.Source = logo;

Oder kürzer, indem Sie einen anderen BitmapImage-Konstruktor verwenden:

finalImage.Source = new BitmapImage(
    new Uri("pack://application:,,,/AssemblyName;component/Resources/logo.png"));

Die URI ist in Teile aufgeteilt:

  • Behörde: application:///
  • Pfad: Der Name einer Ressourcendatei, die in eine referenzierte Assembly kompiliert wird. Der Pfad muss folgendem Format entsprechen: AssemblyShortName[;Version][;PublicKey];component/Path

    • AssemblyShortName: der Kurzname für die referenzierte Assembly.
    • Version [optional]: die Version der referenzierten Assembly, die die Ressourcendatei enthält. Dies wird verwendet, wenn zwei oder mehr referenzierte Assemblies mit demselben Kurznamen geladen werden.
    • PublicKey [optional]: der öffentliche Schlüssel, der zum Signieren der referenzierten Assembly verwendet wurde. Dies wird verwendet, wenn zwei oder mehr referenzierte Assemblies mit demselben Kurznamen geladen werden.
    • ;component: gibt an, dass die Baugruppe, auf die verwiesen wird, von der lokalen Baugruppe referenziert wird.
    • /Path: der Name der Ressourcendatei, einschließlich ihres Pfades, relativ zum Stamm des Projektordners der referenzierten Assembly.

Die drei Schrägstriche nach application: müssen durch Kommas ersetzt werden:

Hinweis: Die Autoritätskomponente eines Pack-URIs ist ein eingebetteter URI, der auf ein Paket verweist und mit RFC 2396 übereinstimmen muss. Außerdem muss das "/"-Zeichen durch das Zeichen "," ersetzt werden, und reservierte Zeichen wie "%" und "?" müssen escaped werden. [ ] für Einzelheiten.

Und stellen Sie natürlich sicher, dass Sie die Build-Aktion für Ihr Bild auf Resource .

192voto

Simon Punkte 32146
var uriSource = new Uri(@"/WpfApplication1;component/Images/Untitled.png", UriKind.Relative);
foo.Source = new BitmapImage(uriSource);

Dadurch wird ein Bild mit dem Namen "Untitled.png" in einen Ordner mit dem Namen "Images" geladen, dessen "Build Action" auf "Resource" in einer Assembly mit dem Namen "WpfApplication1" eingestellt ist.

76voto

Alex B Punkte 2686

Dies ist etwas weniger Code und kann in einer einzigen Zeile erledigt werden.

string packUri = "pack://application:,,,/AssemblyName;component/Images/icon.png";
_image.Source = new ImageSourceConverter().ConvertFromString(packUri) as ImageSource;

50voto

A Bothe Punkte 491

Sehr einfach:

Um das Bild eines Menüpunkts dynamisch einzustellen, müssen Sie nur die folgenden Schritte ausführen:

MyMenuItem.ImageSource = 
    new BitmapImage(new Uri("Resource/icon.ico",UriKind.Relative));

...wohingegen "icon.ico" überall liegen kann (derzeit liegt es im Verzeichnis 'Resources') und als Resource verlinkt werden muss...

21voto

Hasan Punkte 325

S

var uriSource = new Uri("image path here");
image1.Source = new BitmapImage(uriSource);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X