[DataMember]如何与Image一起使用

本文关键字:Image 一起 DataMember | 更新日期: 2023-09-27 18:19:02

我在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]和图像在同一时间?我知道我可以使用字节数组,目前正在这样做,然后在调用我的服务的客户端格式化/转换它,但我宁愿绑定到图像,而不是必须转换字节数组。

[DataMember]如何与Image一起使用

我发现在客户端(调用我的WCF服务的Silverlight应用程序)上使用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;
      }
    }

资源["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();
    }
  }