3 Stimmen

Unterschied zwischen Bild-URI-Verhalten im Code und in XAML

Ich habe ein Bild in einigen XAML als deklariert:

<Image Width="188" Height="56" HorizontalAlignment="Left"  VerticalAlignment="Bottom" Margin="10,0,0,10" Grid.ColumnSpan="2" Grid.Column="0" Source="..\Images\myImage.png" />

Dies ist ein statisches Bild, das sich während der Programmausführung nicht ändern muss.

Ich habe auch ein Bild, das sich zur Laufzeit ändern muss, abhängig von einer Reihe von Werten.

Ich verwende einen iValueConverter, um die Daten in Bilder umzuwandeln, was zu funktionieren scheint, aber ich habe Probleme, die Bilder selbst zu erstellen.

Ich versuche, eine Reihe von System.Windows.Media.Imaging.BitmapImage Objekte, um die Bilder zu speichern. Wie im obigen Code versuche ich, auf ein .PNG zuzugreifen, das im Objekt \Images Verzeichnis:

Dim ThisImage As New BitmapImage(New Uri("..\Images\thisImage.png", UriKind.Relative))

Die Verwendung von `".. \Images\ " scheint für die XAML gut zu funktionieren und öffnet das in [Projektverzeichnis] gespeicherte Bild korrekt. \Images\ , im Code scheint es auf [Projektverzeichnis] zu verweisen \bin\Images\ die es nicht gibt.

Offensichtlich bringe ich hier etwas durcheinander, aber ich möchte nicht versuchen, direkt zu der Datei zu navigieren, da sie sich nach der Installation offensichtlich nicht mehr am selben Ort befinden wird...

Was übersehe ich hier? Warum funktioniert der XAML-URI nicht genauso wie der Code-URI?

3voto

Thomas Levesque Punkte 277723

Wenn Sie die Image.Source Eigenschaft in XAML mit einem URI, einem Konverter ( ImageSourceConverter ) wird verwendet, um diese URI in eine ImageSource Instanz. Der Konverter hat Zugriff auf die IUriContext des XAML-Elements, so dass es den Basis-URI kennt, der für die Auflösung des relativen URI zu verwenden ist.

Wenn Sie eine BitmapImage im Code, die BitmapImage Klasse hat keinen Zugriff auf den URI-Kontext und weiß daher nicht, wie sie den relativen URI auflösen kann. Sie müssen einen absoluten URI angeben, und zwar in der Form "pack://application:,,,/Images/thisImage.png"

1voto

Das Problem ist, dass Sie eine relative Uri verwenden, obwohl Sie in diesem Zusammenhang eine absolute Uri angeben müssen.

Es funktioniert so, wie Sie es in XAML erwarten, denn innerhalb des ImageSourceConverters (der verwendet wird, um einen Uri in XAML in eine ImageSource zu konvertieren) werden relative Uris in absolute Uris konvertiert, indem die IUriContext Dienst, der über den ITypeDescriptorContext . Mit anderen Worten: Der Uri ist keine Zauberei. Es wird viel Arbeit geleistet (in diesem Fall durch den xaml deserializer), um eine relative Uri in xaml in eine ImageSource umzuwandeln.

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