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

Posted

技术标签:

【中文标题】通过 WCF 传递图像并将它们显示在 WPF 数据网格中【英文标题】:Passing an image through WCF and display them in a WPF datagrid 【发布时间】:2010-10-21 11:41:28 【问题描述】:

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

【问题讨论】:

您处理的图像平均有多大?您需要在一个电话中处理多少个?您的问题有几个很好的解决方案,但这实际上取决于您在每次通话中必须处理的信息量。如果您的图像相对较小并且您不必一次返回大量图像,则将其作为字节数组返回是一个很好的解决方案(我问是因为您将它放在数据网格中,所以我假设您可以从服务中获取其中的一些。 【参考方案1】:

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

你需要做的是:

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

public byte[] GetImage(int id)

  // put your logic of retrieving image on the server side here

在您的数据类(网格中显示的对象)中创建一个属性 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
    
  

在您的单元格模板(或任何地方)中放置一个 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>

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

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

【讨论】:

如果图像很小,这只是一个很好的答案......取决于图像的大小。如果它们很大或有大量请求,则此解决方案将不起作用。 好点,布赖恩。如果您能分享您对如何处理大量大图像的想法,那就太好了(为了共同利益)。【参考方案2】:

您可以从流中加载 WPF 图像吗?如果是这样,那么您可以编写 WCF 服务以返回 System.IO.Stream 类型。

【讨论】:

我不知道这就是我问的原因 您可以将流作为消息的一部分发送,只要流被标记为消息正文的唯一部分。消息的所有其他字段都必须转到标题。

以上是关于通过 WCF 传递图像并将它们显示在 WPF 数据网格中的主要内容,如果未能解决你的问题,请参考以下文章

在 WPF 中动态加载图像

在 WPF 应用程序中托管 WCF Web 服务

wpf显示视频,image控件闪屏,使用winform控件实现

通过 WCF 传递匿名类型的实例

如何在 Windows Phone 8.1 上从数据库中获取图像并将其显示为字节数组

如何从 LINQ 转移到 SQL 到“LINQ 到 WCF”?