7 Stimmen

WPF Image UriSource und Datenbindung mit http: \\ URL

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.

13voto

Ragunathan Punkte 1947

WebURL kann nicht als Quelle für die UriSource-Eigenschaft von BitmapImage angegeben werden. Wenn es sich um eine WebURL handelt, müssen Sie das Bild lokal herunterladen und diesen Pfad mit UriSource verbinden. Siehe unten

http://blogs.windowsclient.net/cennest/archive/2010/03/26/code-for-keeps-wpf-silverlight-retrieve-images-from-db-url.aspx

Aktualisierung:

void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        var image = new BitmapImage();
        int BytesToRead=100;

        WebRequest request = WebRequest.Create(new Uri("http://www.interweb.in/attachments/pc-wallpapers/16187d1222942178-nature-wallpaper-nature-summer-wallpaper.jpg", 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();

        myImage.Source = image;
    }

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