2014-04-09 16 views
7

Ich habe zwei .png Dateien zu meinen Ressourcen, die ich auf ihre Uri zugreifen müssen, wenn bindend ist.Wie bekomme ich einen Uri des Bildes in den Ressourcen

Mein xaml Code ist wie folgt:

<Grid> 
    <Image> 
    <Image.Source> 
     <BitmapImage DecodePixelWidth="10" UriSource="{Binding Path=ImagePath}"/> 
    </Image.Source> 
    </Image> 
</Grid> 

und die binding Code ImagePath ist:

ImagePath = resultInBinary.StartsWith("1") ? Properties.Resources.LedGreen : Properties.Resources.ledRed; 

jedoch

Properties.Resources.LedGreen 

gibt eine Bitmap anstelle von String zurück, die den Uri dieses bestimmten Bildes enthält. Ich möchte nur wissen, wie man diesen Wert extrahiert, ohne einen Pfad des Bildes in dem Verzeichnis, das es gespeichert ist, zu adressieren. (Um ehrlich zu sein, ich bin mir nicht sicher, ob das richtig ist, da ich im Internet keine ähnliche Situation finden konnte).

Bitte lassen Sie mich wissen, ob es eine bevorzugte Methode zu der, die ich versuche zu verwenden, wenn verfügbar gibt.

Antwort

18

In einer WPF-Anwendung würden Sie normalerweise keine Bilder in Properties/Resources.resx speichern und über die Klasse Properties.Resources darauf zugreifen.

Stattdessen fügen Sie nur die Bilddateien auf Ihr Visual Studio-Projekt als reguläre Dateien, vielleicht in einem Ordner namens „Bilder“ oder dergleichen. Dann würden Sie ihre Build Action auf Resource setzen, was im Eigenschaftenfenster getan wird. Sie kommen dort z.B. indem Sie mit der rechten Maustaste auf die Bilddatei klicken und den Menüpunkt Properties auswählen. Beachten Sie, dass der Standardwert von Build Action immer Resource für Bilddateien sein sollte.

Um diese Bildressourcen aus Code zugreifen, die Sie dann ein Pack URI verwenden würden. Mit den oben genannten Ordnernamen „Bilder“ und eine Bilddatei mit dem Namen „LedGreen.png“, die Schaffung einer solchen URI würde wie folgt aussehen:

var uri = new Uri("pack://application:,,,/Images/LedGreen.png"); 

So könnten Sie vielleicht Ihre Immobilie deklarieren vom Typ Uri sein:

public Uri ImageUri { get; set; } // omitted INotifyPropertyChanged implementation 

und legen sie es wie folgt aus:

ImageUri = resultInBinary.StartsWith("1") 
     ? new Uri("pack://application:,,,/Images/LedGreen.png") 
     : new Uri("pack://application:,,,/Images/LedRed.png"); 

Schließlich XAML unten wie gezeigt aussehen sollte, die sich auf von Uri zu Image Umwandlung eingebauten Typ beruht:

<Grid> 
    <Image Width="10" Source="{Binding Path=ImageUri}" /> 
</Grid> 
+0

Danke für die beschreibende Antwort und vor allem einen Vorschlag über den richtigen Weg, dies zu tun.Ich habe meine Lösung so implementiert, wie Sie es vorgeschlagen haben, aber ich frage mich, ob ich diese Bilder mit der ausführbaren Datei, die ich dem anderen Team geben werde, behalten muss? Da dies ein ziemlich einfaches Projekt ist, plane ich nicht, einen Installer dafür zu machen. – Mehrad

+1

Nein, die 'Resource' Build Action fügt die Bilddateien zur Assembly hinzu. Sie sind also in der ausführbaren Datei enthalten. – Clemens

1

Deklarieren Sie die Eigenschaft Properties.Resources.LedGreen als ImageSource und legen Sie sie auf den URI-Speicherort und nicht auf das Bitmap-Objekt fest.

Oder wenn Sie darauf bestehen, es als Bitmap zu speichern, können Sie die Quelle erhalten, indem Sie Properties.Resources.LedGreen.ImageSource zurückgeben, die vom Typ ImageSource sein wird.

Ich würde den ersten Ansatz bevorzugen.

Verwandte Themen