Использование управления изображением WPF - PullRequest
0 голосов
/ 12 марта 2011

Привет! Я искал решение для отображения изображений в элементе управления изображением, которое находится внутри списка. Я видел, как установить источник изображения и назначить его new BitmapImage(new Uri(stringX)).

Не в моем случае я первыйполучить все изображения с URL-адреса, используя WebClient, который находится в функции, и эта функция возвращает MemoryStream после некоторого процесса.

Теперь я хочу отобразить это изображение, чтобы у меня не было Uri для созданияновое растровое изображение. Так что я попытался реализовать StreamSource, но я получил

  Set property 'System.Windows.Media.Imaging.BitmapImage.StreamSource' threw an exception.

здесь идет мой код

Получить изображение из Интернета

public MemoryStream GetImage(string id)
        {
            WebResponse result = null;
            Image rImage = null;
            MemoryStream imageStream = null;
            try
            {
                string url = "https://devnmark.com/" + id + "/picture";
                WebRequest request = WebRequest.Create(url);
                result = request.GetResponse();
                Stream stream = result.GetResponseStream();
                BinaryReader br = new BinaryReader(stream);
                byte[] rBytes = br.ReadBytes(1000000);
                br.Close();
                result.Close();
                imageStream = new MemoryStream(rBytes, 0, rBytes.Length);
                imageStream.Write(rBytes, 0, rBytes.Length);
                rImage = Image.FromStream(imageStream, true);
               // imageStream.Close();
            }
            catch (Exception c)
            {
                //MessageBox.Show(c.Message);
            }
            finally
            {
                if (result != null) result.Close();
            }
            return imageStream;

        }

Класс, объявленный для типа

 class UserInfo
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public bool IsChecked { get; set; }
        public MemoryStream Picture { get; set; }
    }

Загрузка изображений

 private void LoadFriends()
        {
            foreach (dynamic imge in MainList)
            {
                if (x >= 6)
                    break;
                UserInfo info = new UserInfo();
                info.Id = int.Parse(imge.id);
                info.Name = imge.name;         
                info.Picture = function.GetImage(info.Id.ToString());
                FriendList.Add(info);
                x++;
            }
            list.ItemsSource = FriendList;
        }

XMAL для ListBox

<ListBox x:Name="list"  Margin="18,100,535,74" >
    <ListBox.ItemTemplate>
       <HierarchicalDataTemplate>
          <StackPanel Orientation="Horizontal">
             <Image Height="50" Width="50">
                 <Image.Source>                                    
                   <BitmapImage StreamSource="Picture" ></BitmapImage>
                 </Image.Source>
             </Image>
             <my:RibbonCheckBox Label="{Binding Name}" IsChecked="{Binding IsChecked}" />                    
          </StackPanel>                     
      </HierarchicalDataTemplate>      
    </ListBox.ItemTemplate>                 
</ListBox>

Ответы [ 2 ]

2 голосов
/ 12 марта 2011

У вас много проблем.

byte[] rBytes = br.ReadBytes(1000000);

Что если размер изображения превышает 1 МБ?

Удалить строку

rImage = Image.FromStream(imageStream, true);

Вы не делаетеЧтобы использовать полученный результат, потребуется время обработки и позиционирование imageStream в конце.

Возможно, вам следует использовать MemoryStream.Seek(), чтобы сбросить поток в его начальное положение перед возвратом..

imageStream.Seek(0, SeekOrigin.Begin);

Редактировать

Ваша привязка XAML неверна

<BitmapImage StreamSource="Picture" ></BitmapImage>

Должно быть

<BitmapImage StreamSource="{Binding Picture}" ></BitmapImage>

, чтобы бытьдопустимое связывание, но я на самом деле не уверен, можете ли вы вообще связать StreamSource или вам нужно инициализировать из кода, как в примере в самом низу msdn doc .

0 голосов
/ 12 марта 2011

Насколько мне известно, веб-сайт требует какой-то аутентификации.Вы предоставили это?Не могли бы вы дать нам рабочий URL?

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