通过WCF传递图像并将其显示在WPF数据网格中

Che*_*rot 6 .net wpf wcf image

WCF服务中传递图像的最佳方法是什么,在传递之后,将其显示在WPF数据网格中?

arc*_*aut 8

我不是说这是唯一或最好的解决方案,但我们的工作方式如下:

你需要做的是:

创建一个WCF方法,该方法将通过某个id或其他方式返回图像.它应该返回字节数组(byte []):

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

在你的数据类(网格中显示的对象)中创建一个属性Image,它的getter应该调用WCF方法并将字节数组转换为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
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

在您的单元格模板(或任何地方)中放置一个Image控件并将其Source属性绑定到上面创建的Image属性:

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

检索图像时不冻结UI的最简单方法是将IsAsync属性设置为false,就像我一样.但是还有很多需要改进的地方.例如,您可以在加载图像时显示一些加载动画.

使用PriorityBinding可以在加载其他内容时显示内容(您可以在此处阅读:http://msdn.microsoft.com/en-us/library/ms753174.aspx).