2010-06-30 31 views
6

Tengo un problema al mostrar una imagen con una URL web en un control de usuario de WPF. He revisado todas las sugerencias para un problema similar formulado en este sitio en agosto de 2008 (Image UriSource and Data Binding) pero ninguna de esas sugerencias ha funcionado.WPF Image UriSource y enlace de datos usando http: \ URL

Lo que me gustaría hacer es:

<Image Width="50" Name="MemberImage"> 
    <Image.Source> 
     <BitmapImage DecodePixelWidth="50" UriSource="{Binding Member.ImageFilePathUri}" /> 
    </Image.Source> 
</Image> 

ImageFilePathUri es un URI creado a partir de la ruta de cadena a través de:

public Uri ImageFilePathUri 
    { 
     get 
     { 
      return new Uri(this.ImageFilePath); 
     } 
    } 
} 

Esto le da a la "Propiedad 'UriSource' o la propiedad 'StreamSource ' se debe establecer." error como se esperaba

También he intentado usar un convertidor de valores:

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; 
    } 
} 

Sin embargo, la unión a él usando:

<Image Name="TestImage" Width="50" Source="{Binding Path=Member.ImageFilePath, Converter=Parliament.HansardApplicationSuite.Logging.Helpers.ImageConverter}"></Image> 

no muestra la imagen.

Un nuevo intento de cargar la imagen mediante programación, en el constructor de control y/o en el evento de control Cargado tampoco han trabajado:

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; 
} 

Lo único que ha funcionado es guardar la imagen en un archivo local ruta y mostrar que:

<Image Width="50" Name="MemberImage"> 
    <Image.Source> 
     <BitmapImage DecodePixelWidth="50" UriSource="C:\Data\6bc64e7b-2df5-40d5-b6c4-eaf732318222.jpg" /> 
    </Image.Source> 
</Image> 

Obviamente, esto solo es útil para depurar el problema y no es una solución. El mismo código pero sustituyendo la dirección http por la ruta del archivo local no funciona.

<Image.Source> 
    <BitmapImage DecodePixelWidth="50" UriSource="http://member.org/6bc64e7b-2df5-40d5-b6c4-eaf732318222.jpg" /> 
</Image.Source> 

Actualización:

Ésta es la aplicación MemberImage propiedad.

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; 
    } 
} 

Actualización:

Ésta es la forma en que estoy vinculante para el control en mi opinión:

<Image Width="50" Source="{Binding MemberImage}" /> 

MemberImage es la propiedad que he dado anteriormente. Mi contexto de datos se está configurando correctamente porque esa propiedad se está ejecutando, simplemente no devuelve una imagen.

Respuesta

10

No se puede proporcionar WebURL como fuente a la propiedad UriSource de BitmapImage. Si es weburl necesita descargar esa imagen localmente y vincular esa ruta a UriSource. Ver el siguiente

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

Actualización:

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; 
    } 
+0

de trapo, gracias por el enlace. Intenté implementarlo creando una propiedad, MemberImage, devolviendo un BitmapImage usando el ejemplo en el blog y luego vinculando mi Image.Source a esa propiedad, pero aún no aparece. ¿Esto significa que necesito guardar la imagen primero y luego enlazarla con esa ruta de archivo? –

+0

No, simplemente funcionará. ¿Puedes publicar el código de propiedad de MemberImage? – Ragunathan

+0

He actualizado mi pregunta original con la implementación de MemberImage. Esto todavía no funciona, simplemente no devuelve ninguna imagen. –