如何在Image中使用[DataMember]?

3

我在一个WCF服务中有如下代码:

[DataContract]
[KnownType(typeof(Bitmap))]
[KnownType(typeof(Image))]  
public class CompositeType {
Image FImg = null;
public Image Picture {
  get {
    return FImg;
  }
  set {
    FImg = value;
  }
}

如果我在公共图像中添加[DataMember],那么另一个解决方案中的服务引用就会出现问题。
[DataMember]
public Image Picture{
  get {
    return FImg;
  }
  set {
    FImg = value;
  }
}

我的问题是如何同时使用[DataMember]和Image?我知道可以使用字节数组,我当前正在使用它,并在调用我的服务的客户端中进行格式化/转换,但我宁愿绑定到图像而不是必须转换字节数组。


从那个问题的被接受答案可以得知:"无论如何,您都需要将其转换为 byte[] 或 Stream 才能将其发送到网络,并将其作为图像重新生成。" - Yuck
为什么你不想要一个流或者一个字节数组?如果可能的话,你的WCF服务只会被.NET客户端使用。你应该有一个非常好的理由想要这样做:)。 - albertjan
@David - 一个可能不太吸引人的方法是返回图像的base64编码字符串(虽然不如流式处理方法好)。你的消息会增加33%,但至少你不必流式传输字节数组。 - M.Babcock
@M.Babcock 您不必流式传输 Byte[]。您只需要在将其传递到服务或从服务中传递时将 Image 转换为 Byte[] 即可。这并不难,只是没有 WCF 为您处理序列化那么神奇。 - Yuck
@Yuck - 非常感谢您的信息(考虑到我以前从未做过这样的事情),但是David似乎非常坚决地不想使用byte[],所以我的评论仍然成立(只需忽略流式传输部分)。 - M.Babcock
显示剩余5条评论
1个回答

0

我发现在客户端(Silverlight应用程序调用我的WCF服务)上使用AutoGeneratingColumn事件处理程序也可以。虽然不一定是对我的问题的答案,但我认为这很有用。我本来想添加评论,但代码太长了。

private void dgResults_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) {
      if (e.PropertyType == typeof(byte[])) {
        e.Column.Header = e.Column.Header + "_D";
        // Create a new template column.
        DataGridTemplateColumn templateColumn = new DataGridTemplateColumn();
        templateColumn.Header = e.Column.Header + "_E";
        templateColumn.CellTemplate = (DataTemplate)Resources["imgTemplate"];
        templateColumn.CellEditingTemplate = (DataTemplate)Resources["imgTemplate"];
        // ...
        // Replace the auto-generated column with the templateColumn.
        e.Column = templateColumn;

      }
    }

Resources["imgTemplate"] 是在 Silverlight 的 .XAML 文件中创建的,而这段代码则是在其代码后台中。

<UserControl.Resources>
    <local:BinaryArrayToURIConverter x:Key="binaryArrayToURIConverter" />
    <DataTemplate x:Key="imgTemplate">
      <Image x:Name="img" Source="{Binding GraphicBytes,Converter={StaticResource binaryArrayToURIConverter}}"/>
    </DataTemplate>
  </UserControl.Resources>

本地:指主要 XAML 声明的一部分:

xmlns:local="clr-namespace:<your namespace here>"

BinaryArrayToURIConverter的代码:

public class BinaryArrayToURIConverter : IValueConverter {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
      MemoryStream ms = new MemoryStream((byte[])value);
      BitmapImage image = new BitmapImage();
      image.SetSource(ms);
      return image;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
      throw new NotImplementedException();
    }
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接