456 Stimmen

Speichern von WPF-Bildressourcen

Für eine WPF-Anwendung, die 10-20 kleine Symbole und Bilder für illustrative Zwecke benötigen wird, ist das Speichern dieser in der Assembly als eingebettete Ressourcen der richtige Weg zu gehen?

Wenn ja, wie gebe ich in XAML an, dass ein Bild-Steuerelement das Bild von einer eingebetteten Ressource laden soll?

519voto

Drew Noakes Punkte 282438

Wenn Sie das Bild an mehreren Stellen verwenden werden, lohnt es sich, die Bilddaten nur einmal in den Speicher zu laden und sie dann für alle Image Elemente.

Erstellen Sie dazu eine BitmapSource als Ressource irgendwo:

<BitmapImage x:Key="MyImageSource" UriSource="../Media/Image.png" />

Verwenden Sie dann in Ihrem Code etwas wie:

<Image Source="{StaticResource MyImageSource}" />

In meinem Fall habe ich festgestellt, dass ich die Einstellung Image.png Datei eine Build-Aktion von Resource und nicht nur Content . Dies bewirkt, dass das Bild in die kompilierte Baugruppe aufgenommen wird.

207voto

Nuno Rodrigues Punkte 2012

Ich habe festgestellt, dass die Verwendung von Bildern, Videos usw. die beste Praxis ist:

  • Ändern Sie Ihre Dateien "Aktion aufbauen" a "Inhalt" . Prüfen Sie unbedingt In das Build-Verzeichnis kopieren .
    • Zu finden im "Rechtsklick"-Menü des Solution Explorer-Fensters.
  • Bildquelle in folgendem Format:
    • "/ "IhrVersammlungsname" Komponente/"IhrPfad"/ "IhrBild.png" "

Beispiel

<Image Source="/WPFApplication;component/Images/Start.png" />

Vorteile:

  • Dateien werden nicht in die Baugruppe eingebettet.
    • Der Ressourcenmanager wird bei zu vielen Ressourcen (zum Zeitpunkt der Erstellung) Probleme mit dem Speicherüberlauf verursachen.
  • Kann zwischen Versammlungen aufgerufen werden.

51voto

Eric Ouellet Punkte 9965

Im Code zum Laden einer Ressource in der ausführenden Assembly, wo mein Bild Freq.png befand sich in dem Ordner Icons und definiert als Resource :

this.Icon = new BitmapImage(new Uri(@"pack://application:,,,/" 
    + Assembly.GetExecutingAssembly().GetName().Name 
    + ";component/" 
    + "Icons/Freq.png", UriKind.Absolute)); 

Ich habe auch eine Funktion erstellt:

/// <summary>
/// Load a resource WPF-BitmapImage (png, bmp, ...) from embedded resource defined as 'Resource' not as 'Embedded resource'.
/// </summary>
/// <param name="pathInApplication">Path without starting slash</param>
/// <param name="assembly">Usually 'Assembly.GetExecutingAssembly()'. If not mentionned, I will use the calling assembly</param>
/// <returns></returns>
public static BitmapImage LoadBitmapFromResource(string pathInApplication, Assembly assembly = null)
{
    if (assembly == null)
    {
        assembly = Assembly.GetCallingAssembly();
    }

    if (pathInApplication[0] == '/')
    {
        pathInApplication = pathInApplication.Substring(1);
    }
    return new BitmapImage(new Uri(@"pack://application:,,,/" + assembly.GetName().Name + ";component/" + pathInApplication, UriKind.Absolute)); 
}

Verwendung (vorausgesetzt, Sie setzen die Funktion in eine ResourceHelper-Klasse):

this.Icon = ResourceHelper.LoadBitmapFromResource("Icons/Freq.png");

Hinweis : siehe MSDN Pack URIs in WPF :
pack://application:,,,/ReferencedAssembly;component/Subfolder/ResourceFile.xaml

49voto

Craig Punkte 491

Einige Leute fragen, wie man das im Code macht und bekommen keine Antwort.

Nachdem ich viele Stunden mit der Suche verbracht habe, habe ich eine sehr einfache Methode gefunden, aber ich habe kein Beispiel gefunden und deshalb teile ich meine hier die mit Bildern funktioniert. (meins war ein .gif)

Zusammenfassung:

Es gibt einen BitmapFrame zurück, den ImageSource "Ziele" zu mögen scheinen.

Verwendung:

doGetImageSourceFromResource ("[YourAssemblyNameHere]", "[YourResourceNameHere]");

Methode:

static internal ImageSource doGetImageSourceFromResource(string psAssemblyName, string psResourceName)
{
    Uri oUri = new Uri("pack://application:,,,/" +psAssemblyName +";component/" +psResourceName, UriKind.RelativeOrAbsolute);
    return BitmapFrame.Create(oUri);
}

Gelerntes:

Meiner Erfahrung nach ist der Pack-String nicht das Problem, überprüfen Sie Ihre Streams und vor allem, ob das erste Lesen den Zeiger auf das Ende der Datei gesetzt hat. auf das Ende der Datei gesetzt hat und Sie ihn vor dem erneuten Lesen wieder auf Null setzen müssen.

Ich hoffe, dies erspart Ihnen die vielen Stunden, die ich mir für dieses Stück gewünscht hätte!

48voto

ema Punkte 5377

Ja, das ist der richtige Weg.

Sie können das Bild in der Ressourcendatei verwenden, indem Sie einfach den Pfad angeben:

<Image Source="..\Media\Image.png" />

Sie müssen die Build-Aktion der Image-Datei auf "Ressource" setzen.

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