Ich versuche, die Quelle eines WPF-Bildes im Code festzulegen. Das Bild wird als Ressource in das Projekt eingebettet. Anhand von Beispielen habe ich den folgenden Code gefunden. Aus irgendeinem Grund funktioniert es nicht - das Bild wird nicht angezeigt.
Durch das Debuggen kann ich sehen, dass der Stream die Bilddaten enthält. Also, was ist 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 ungefähr so definiert: <Image x:Name="_icon" Width="16" Height="16" />
<Image Source="some_fully_qualified_path">
schlägt die XAML niemals fehl.Antworten:
Nachdem ich das gleiche Problem wie Sie hatte und etwas gelesen hatte, entdeckte ich die Lösung - Pack URIs .
Ich habe im Code Folgendes getan:
Oder kürzer, indem Sie einen anderen BitmapImage-Konstruktor verwenden:
Die URI ist in Teile unterteilt:
application:///
Pfad: Der Name einer Ressourcendatei, die zu einer Assembly zusammengestellt wird, auf die verwiesen wird. Der Pfad muss dem folgenden Format entsprechen:
AssemblyShortName[;Version][;PublicKey];component/Path
Die drei Schrägstriche danach
application:
müssen durch Kommas ersetzt werden:Und natürlich stellen Sie sicher, dass Sie die Build-Aktion für Ihr Image auf setzen
Resource
.quelle
BitmapImage(Uri)
Konstruktors ignorieren , was dazu beiträgt, die Notwendigkeit zu vermeiden, BeginInit und EndInit aufzurufen. Ich habe es hier hinzugefügt.Dadurch wird ein Bild mit dem Namen "Untitled.png" in einen Ordner mit dem Namen "Images" geladen, dessen "Build Action" in einer Assembly mit dem Namen "WpfApplication1" auf "Resource" gesetzt ist.
quelle
var uriSource = new Uri("Images/Untitled.png", UriKind.Relative);
würde ausreichenDies ist etwas weniger Code und kann in einer einzigen Zeile ausgeführt werden.
quelle
Sehr leicht:
Führen Sie nur die folgenden Schritte aus, um das Bild eines Menüelements dynamisch festzulegen:
... während "icon.ico" überall zu finden ist (derzeit befindet es sich im Verzeichnis "Ressourcen") und als Ressource verknüpft werden muss ...
quelle
Sie können dies auch auf eine Zeile reduzieren. Dies ist der Code, mit dem ich das Symbol für mein Hauptfenster festgelegt habe. Es wird davon ausgegangen, dass die .ico-Datei als Inhalt markiert ist und in das Ausgabeverzeichnis kopiert wird.
quelle
Einfachster Weg:
quelle
Hast du es versucht:
quelle
Das ist mein Weg:
Verwendungszweck:
quelle
Hier ist ein Beispiel, das den Bildpfad dynamisch festlegt (Bild befindet sich irgendwo auf der Disc, anstatt als Ressource zu erstellen):
Reflexionen über Symbole ...
Zuerst würden Sie denken, dass die Icon-Eigenschaft nur ein Bild enthalten kann. Aber es kann tatsächlich alles enthalten! Ich habe dies zufällig entdeckt, als ich programmgesteuert versuchte, die
Image
Eigenschaft direkt auf eine Zeichenfolge mit dem Pfad zu einem Bild festzulegen. Das Ergebnis war, dass nicht das Bild, sondern der eigentliche Text des Pfades angezeigt wurde!Dies führt zu einer Alternative, bei der kein Bild für das Symbol erstellt werden muss, sondern stattdessen Text mit einer Symbolschrift verwendet wird, um ein einfaches "Symbol" anzuzeigen. Im folgenden Beispiel wird die Wingdings-Schriftart verwendet, die ein "Disketten" -Symbol enthält. Dieses Symbol ist wirklich das Zeichen
<
, das in XAML eine besondere Bedeutung hat, daher müssen wir<
stattdessen die codierte Version verwenden. Das funktioniert wie ein Traum! Das Folgende zeigt ein Diskettensymbol als Symbol im Menüpunkt:quelle
Wenn Ihr Bild in einem ResourceDictionary gespeichert ist, können Sie dies mit nur einer Codezeile tun:
quelle
Es gibt auch einen einfacheren Weg. Wenn das Bild als Ressource in die XAML geladen wird und der betreffende Code der Code-Behind für diesen XAML-Inhalt ist:
quelle
Legen Sie den Rahmen in einen VisualBrush:
Fügen Sie den VisualBrush in GeometryDrawing ein
Fügen Sie nun das GeometryDrawing in ein DrawingImage ein:
Platzieren Sie dies auf Ihrer Bildquelle und voilà!
Sie könnten es aber viel einfacher machen:
Und im Code:
quelle
Es gibt auch einen einfacheren Weg. Wenn das Bild als Ressource in die XAML geladen wird und der betreffende Code der Code für diese XAML ist:
Hier ist das Ressourcenwörterbuch für eine XAML-Datei - die einzige Zeile, die Sie interessiert, ist der ImageBrush mit dem Schlüssel "PosterBrush" - der Rest des Codes dient nur zur Anzeige des Kontexts
Im Code dahinter können Sie dies jetzt einfach tun
quelle
So laden Sie ein Bild aus eingebetteten Ressourcensymbolen und -bildern (korrigierte Version von Arcturus):
Angenommen, Sie möchten eine Schaltfläche mit einem Bild hinzufügen. Was sollte man tun?
Jetzt ist es Zeit, unser Bild in XAML zu laden
Erledigt.
quelle
Ich bin neu in WPF, aber nicht in .NET.
Ich habe fünf Stunden lang versucht, eine PNG-Datei zu einem "WPF Custom Control Library-Projekt" in .NET 3.5 (Visual Studio 2010) hinzuzufügen und als Hintergrund für ein von Bildern vererbtes Steuerelement festzulegen.
Es hat nichts mit URIs zu tun. Ich kann mir nicht vorstellen, warum es keine Methode gibt, um einen URI aus einer Ressourcendatei über IntelliSense abzurufen, vielleicht als:
Ich habe viele URIs ausprobiert und mit ResourceManager und GetManifest-Methoden von Assembly gespielt, aber es gab nur Ausnahmen oder NULL-Werte.
Hier schreibe ich den Code, der für mich funktioniert hat:
quelle
Wenn Sie bereits einen Stream haben und das Format kennen, können Sie Folgendes verwenden:
quelle
Du hast nur ein bisschen verpasst.
Um eine eingebettete Ressource von einer Assembly zu erhalten, müssen Sie den Assemblynamen mit Ihrem Dateinamen angeben, wie ich hier erwähnt habe:
quelle