2009-04-23 12 views
6

¿Cuál es la mejor manera de pasar una imagen en un servicio WCF, y después de pasarla, mostrarla en una cuadrícula de datos WPF?Pasar una imagen a través de WCF y visualizarla en una cuadrícula de datos WPF

+0

¿Qué tan grande en promedio son las imágenes que está tratando? ¿Con cuántos de ellos tiene que lidiar en una sola llamada? Existen varias buenas soluciones para su pregunta, pero realmente depende de la cantidad de información que tenga que tratar en cada llamada. Devolverlo como una matriz de bytes es solo una buena solución si las imágenes van a ser relativamente pequeñas y no tiene que devolver un gran número de ellas a la vez (se lo pregunto porque lo está colocando en una cuadrícula de datos, entonces Supongo que podría estar recibiendo una cantidad de ellos del servicio. –

Respuesta

8

No digo que esta es la única o la mejor solución, pero tenemos que trabajar de esta manera:

Lo que hay que hacer es:

crear un método de WCF que devolvería la imagen por alguna identificación o lo que sea. Debe devolver el conjunto de bytes (byte []):

public byte[] GetImage(int id) 
{ 
    // put your logic of retrieving image on the server side here 
} 

En su clase de datos (objetos que se muestran en la cuadrícula) hacer que una propiedad de imagen, su comprador debe llamar al método WCF y convertir la matriz de bytes a un BitmapImage:

public BitmapImage Image 
{ 
    get 
    { 
    // here - connection is your wcf connection interface 
    //  this.ImageId is id of the image. This parameter can be basically anything 
    byte[] imageData = connection.GetImage(this.ImageId);  

    // Load the bitmap from the received byte[] array 
    using (System.IO.MemoryStream stream = new System.IO.MemoryStream(imageData, 0, imageData.Length, false, true)) 
    { 
    BitmapImage bmp = new BitmapImage(); 
    bmp.BeginInit(); 
    bmp.StreamSource = stream; 

    try 
     { 
     bmp.EndInit(); 
     bmp.Freeze(); // helps for performance 

     return bmp; 
     } 
    catch (Exception ex) 
     { 
     // Handle exceptions here 
     } 

    return null; // return nothing (or some default image) if request fails 
    } 
    } 
} 

En la plantilla de celda (o donde sea) poner un control de imagen y unirse a su propiedad Source a la propiedad imagen creada anteriormente:

<DataTemplate> <!-- Can be a ControlTemplate as well, depends on where and how you use it --> 
    <Image 
    Source={Binding Image, IsAsync=true} 
    /> 
</DataTemplate> 

la forma más sencilla de hacer que la interfaz de usuario no libre Cuando recupere las imágenes, establecerá la propiedad IsAsync en false como lo hice. Pero hay mucho para mejorar. P.ej. podría mostrar alguna animación de carga mientras se carga la imagen.

Al mostrar algo mientras se carga algo más se puede lograr usando PriorityBinding (puede leer sobre esto aquí: http://msdn.microsoft.com/en-us/library/ms753174.aspx).

+0

¿Cómo puedo mostrar la animación al cargar la imagen? –

+0

He actualizado la respuesta – arconaut

+0

Esta es solo una buena respuesta si las imágenes son pequeñas ... dependiendo del tamaño de la imagen. Si son grandes o si hay un gran volumen de solicitudes, esta solución no funcionará. –

0

¿Se puede cargar la imagen WPF en una secuencia? De ser así, puede escribir el servicio WCF para devolver el tipo System.IO.Stream.

+1

No sé por qué le pregunto –

+0

Puede enviar una transmisión como parte de un mensaje, siempre y cuando la transmisión esté marcada como la única parte del cuerpo del mensaje Todos los demás campos del mensaje tendrán que ir al encabezado – SaguiItay

Cuestiones relacionadas