Ich habe ein Problem mit der Anzeige eines Bildes mit einer Web-URL in einem WPF-Benutzerelement. Ich habe durch alle Vorschläge für ein ähnliches Problem auf dieser Website im August 2008 gefragt gearbeitet ( Image UriSource und Datenbindung ), aber keiner dieser Vorschläge hat funktioniert.
Was ich gerne tun würde, ist:
<Image Width="50" Name="MemberImage">
<Image.Source>
<BitmapImage DecodePixelWidth="50" UriSource="{Binding Member.ImageFilePathUri}" />
</Image.Source>
</Image>
ImageFilePathUri ist eine Uri, die aus der Zeichenkette path through erstellt wird:
public Uri ImageFilePathUri
{
get
{
return new Uri(this.ImageFilePath);
}
}
}
Dies führt erwartungsgemäß zu dem Fehler "Property 'UriSource' or property 'StreamSource' must be set.
Ich habe auch versucht, einen Wertkonverter zu verwenden:
public class ImageConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var image = new BitmapImage();
image.BeginInit();
if (value != null)
{
image.UriSource = new Uri((string)value);
}
image.DecodePixelWidth = 50;
image.EndInit();
return image;
}
}
Die Bindung an das System erfolgt jedoch über:
<Image Name="TestImage" Width="50" Source="{Binding Path=Member.ImageFilePath, Converter=Parliament.HansardApplicationSuite.Logging.Helpers.ImageConverter}"></Image>
wird das Bild nicht angezeigt.
Ein weiterer Versuch, das Bild programmatisch zu laden, im Konstruktor des Steuerelements und/oder im Loaded-Ereignis des Steuerelements, hat ebenfalls nicht funktioniert:
if (this.MemberRollItemViewModel.Member != null)
{
var image = new BitmapImage();
image.BeginInit();
image.UriSource = new Uri(this.MemberRollItemViewModel.Member.ImageFilePath);
image.DecodePixelWidth = 50;
image.EndInit();
this.MemberImage.Source = image;
}
Das einzige, was funktioniert hat, ist das Speichern des Bildes in einem lokalen Dateipfad und die Anzeige dieses Pfades:
<Image Width="50" Name="MemberImage">
<Image.Source>
<BitmapImage DecodePixelWidth="50" UriSource="C:\Data\6bc64e7b-2df5-40d5-b6c4-eaf732318222.jpg" />
</Image.Source>
</Image>
Dies ist natürlich nur zur Fehlersuche nützlich und stellt keine Lösung des Problems dar. Derselbe Code, bei dem der lokale Dateipfad durch die http-Adresse ersetzt wird, funktioniert nicht.
<Image.Source>
<BitmapImage DecodePixelWidth="50" UriSource="http://member.org/6bc64e7b-2df5-40d5-b6c4-eaf732318222.jpg" />
</Image.Source>
Aktualisierung:
Dies ist die Implementierung der MemberImage-Eigenschaft.
public BitmapImage MemberImage
{
get
{
var image = new BitmapImage();
if (this.Member != null)
{
WebRequest request = WebRequest.Create(new Uri(this.Member.ImageFilePath, UriKind.Absolute));
request.Timeout = -1;
WebResponse response = request.GetResponse();
Stream responseStream = response.GetResponseStream();
BinaryReader reader = new BinaryReader(responseStream);
MemoryStream memoryStream = new MemoryStream();
byte[] bytebuffer = new byte[BytesToRead];
int bytesRead = reader.Read(bytebuffer, 0, BytesToRead);
while (bytesRead > 0)
{
memoryStream.Write(bytebuffer, 0, bytesRead);
bytesRead = reader.Read(bytebuffer, 0, BytesToRead);
}
image.BeginInit();
memoryStream.Seek(0, SeekOrigin.Begin);
image.StreamSource = memoryStream;
image.EndInit();
}
return image;
}
}
Aktualisierung:
So binde ich in meiner Ansicht an das Steuerelement:
<Image Width="50" Source="{Binding MemberImage}" />
MemberImage ist die Eigenschaft, die ich oben angegeben habe. Mein Datenkontext ist richtig eingestellt, weil diese Eigenschaft ausgeführt wird, es ist nur nicht ein Bild zurück.