Передача изображения через WCF и отображение его в сетке данных WPF - PullRequest
6 голосов
/ 24 апреля 2009

Как лучше всего передать изображение в сервисе WCF , а после его передачи отобразить его в сетке данных WPF ?

Ответы [ 2 ]

8 голосов
/ 07 мая 2009

Я не говорю, что это единственное или лучшее решение, но у нас оно работает так:

Что вам нужно сделать, это:

Создайте метод WCF, который бы возвращал изображение по некоторому идентификатору или как-то еще. Должен возвращать байтовый массив (byte []):

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

В вашем классе данных (объекты, отображаемые в сетке) создайте свойство Image, его получатель должен вызвать метод 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>

Самый простой способ не останавливать пользовательский интерфейс при получении изображений - установить для свойства IsAsync значение false, как я. Но есть что улучшить. Например. Вы можете показать анимацию загрузки во время загрузки изображения.

Отображение чего-либо во время загрузки чего-либо может быть выполнено с помощью PriorityBinding (вы можете прочитать об этом здесь: http://msdn.microsoft.com/en-us/library/ms753174.aspx).

0 голосов
/ 24 апреля 2009

Можете ли вы загрузить изображение WPF из потока? Если это так, то вы можете написать службу WCF для возврата типа System.IO.Stream.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...