Асинхронная загрузка изображений - PullRequest
2 голосов
/ 07 февраля 2012

Я хочу использовать лучший способ показывать изображения в моем PanoramaPage. Я загружаю одну страницу и показываю информацию, а затем хочу асинхронно загрузить другую страницу с изображениями. Поэтому я использую HttpWebRequest и получаю ответ. Все хорошо и надеюсь, что это лучший способ для них. Поэтому я создаю свою GaleryViewModel и для всех изображений на странице добавляю URL в свой класс. И есть проблема. Я не могу видеть изображения в поле зрения. Это мой взгляд:

<ListBox ItemsSource="{Binding Images}" x:Name="listImages" Height="652" Canvas.Top="80">
    <ListBox.ItemTemplate>
        <DataTemplate>
           <StackPanel Orientation="Horizontal" Margin="0,0,0,17">
               <Image Height="100" Width="100" Margin="12,0,9,0" >
                   <Image.Source>
                       <BitmapImage UriSource="{Binding ImgURL}" CreateOptions="BackgroundCreation"/>
                   </Image.Source>
               </Image>
               <TextBlock Text="{Binding LineOne}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/>
           </StackPanel>
       </DataTemplate>
   </ListBox.ItemTemplate>
</ListBox>

Это содержимое моего обработчика событий WebResponse:

MovieExt movie = this.DataContext as MovieExt;

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(response);

var photos = from ti in doc.DocumentNode.Descendants("div")
             where ti.Attributes["class"] != null && ti.Attributes["class"].Value == "photo"
             select ti;
Regex rgx = new Regex("http://[0-9a-zA-Z_./]+");

foreach (var photo in photos)
{
    GaleryViewModel fotka = new GaleryViewModel();
    string style = photo.Attributes["style"].Value;

    MatchCollection matches = rgx.Matches(style);
    if (matches.Count > 0)
    {
        foreach (Match match in matches)
            fotka.ImgURL = match.Value;
    }
    fotka.LineOne = "Test";
    movie.Images.Add(fotka);
}
this.DataContext = movie;
this.listImages.ItemsSource = movie.Images;

и для всех GaleryViewModel и MovieExt:

    public class GaleryViewModel : INotifyPropertyChanged
    {
      private string _imgUrl;
      public string ImgURL
      {
        get
        {
            return _imgUrl;
        }
        set
        {
            if (value != _imgUrl)
            {
                _imgUrl = value;
                NotifyPropertyChanged("ImgURL");
            }
        }
    }

    private string _lineOne;
    public string LineOne
    {
        get
        {
            return _lineOne;
        }
        set
        {
            if (value != _lineOne)
            {
                _lineOne = value;
                NotifyPropertyChanged("LineOne");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(String propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (null != handler)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

public class MovieExt
{
    public string Title { get; set; }
    public string Year { get; set; }
    public string Url { get; set; }
 ...
    public List<GaleryViewModel> Images { get; set; }
 ...
 }

Я не уверен, что я делаю неправильно, но я думаю, что это что-то связывающее. Спасибо за помощь

Ответы [ 3 ]

0 голосов
/ 14 февраля 2012

Вы должны преобразовать Uri в BitmapImage, потому что BitmapImage UriSource - это поток. Пожалуйста, посмотрите на это: Image UriSource и привязка данных

0 голосов
/ 17 февраля 2012

Заменить метод загрузки (только для теста) на:

MovieExt movie = new MovieExt();
movie.Images = new List<GaleryViewModel>();
GaleryViewModel fotka1 = new GaleryViewModel();
fotka1.LineOne = "line1";
fotka1.ImgURL = "http://proservice.kiev.ua/wp-content/uploads/2011/10/apple-logo.jpg";
GaleryViewModel fotka2 = new GaleryViewModel();
fotka2.LineOne = "line2";
fotka2.ImgURL = "http://www.mykhailenko.com/blog/wp-content/uploads/2010/12/apple-logo-history-2.png";
movie.Images.Add(fotka1);
movie.Images.Add(fotka2);
listImages.ItemsSource = movie.Images;

и все работает

Я думаю, проблема в этой строке:

if (matches.Count > 0)

У вас нет совпадений, поэтому ваш Url пуст

Можете ли вы предоставить нам данные, которые ваш сервис возвращает к отладочному коду в вашем контексте?

Кроме того, зачем вам нужен цикл для этого назначения?

foreach (Match match in matches)
    fotka.ImgURL = match.Value;
0 голосов
/ 07 февраля 2012

Глядя на это, похоже, что вы не уведомили об изменении свойства MovieExt.Images. Без этого ваш ListBox не будет обновлять Items. Для этого MovieExt также потребуется поддержка INotifyPropertyChanged.

...