Image.Quelle an String in WPF binden?

8

Ich habe unter XAML-Code:

%Vor%

Außerdem gibt es eine Methode, die ein Bild aus einem Base64 string erstellt:

%Vor%

Ich werde jetzt TestImage an die Ausgabe von Base64StringToImage method binden.
Ich habe den folgenden Weg benutzt:

%Vor%

aber nichts passiert.
Wie kann ich es beheben?

Übrigens bin ich mir sicher, dass die Base64-Zeichenfolge korrekt ist

    
Mohammad Dayyan 04.04.2010, 08:27
quelle

2 Antworten

14

Als Ergänzung zur ausgezeichneten Antwort von @ itowlson sollte Ihr Code folgendermaßen aussehen:

%Vor%     
Simon Buchan 04.04.2010, 10:29
quelle
22

Lass uns zusammenbrechen, was du tust.

%Vor%

Damit dies funktioniert, muss die Bindungsquelle entweder eine ImageSource oder eine Zeichenfolge sein, die einen URI für eine Bilddatei darstellt. Sehen wir uns an, was die ImageSource-Eigenschaft tatsächlich ist.

%Vor%

Ein Problem hierbei ist, dass ImageSource keine PropertyChanged-Ereignisse auslöst. WPF wird daher das Bindungsziel nicht aktualisieren, wenn Sie die Eigenschaft aktualisieren.

ImageSource ist jedoch keine ImageSource, sondern eine Zeichenfolge. Das ist in Ordnung, aber WPF wird diese Zeichenfolge als URI interpretieren. Was ist das URI?

%Vor%

Dies ist der Kern Ihres Problems. Die ImageSource-Zeichenfolge ist keine URI, da Ihr Image keine adressierbare Ressource ist. Base64StringToImage erstellt eine ImageSource im Speicher aus der Base64-Zeichenfolge und gibt dann ein Image mit dieser als Quelle zurück. Dann nehmen Sie die Bildquelle (die ein ImageSource-Objekt ist) und stringieren diese. Das könnte funktionieren, wenn die ImageSource aus einer Datei oder URL stammt, aber nicht: Sie stammt von einem HBITMAP. Das Ergebnis von ToString () wird also bedeutungslos sein. Daher wird ImageSource auf etwas Bedeutungsloses gesetzt, und Ihr Image versucht, diese bedeutungslose Sache als URL einer Bitmap-Datei zu interpretieren.

Um das zu beheben, müssen Sie drei Dinge tun:

  1. Heben Sie das PropertyChanged-Ereignis für die ImageSource-Eigenschaft auf (oder machen Sie es zu einer Abhängigkeitseigenschaft).
  2. Ändern Sie die ImageSource-Eigenschaft so, dass sie vom Typ ImageSource statt vom Typ string ist (damit sie URL-freie Bildquellen enthalten kann).
  3. Ändern Sie Ihren Setter-Aufruf, um ImageSource auf Base64StringToImage(...).Source zu setzen - d. h. entfernen Sie den Aufruf ToString (). Besser noch, ändern Sie Base64StringToImage, um eine ImageSource anstelle eines Image zurückzugeben: Das Erstellen eines Image-Elements erzeugt nur einen Overhead, weil Sie wirklich an der BitmapSource interessiert sind.
itowlson 04.04.2010 09:52
quelle

Tags und Links