2011-02-04 2 views
2

Я использую собственный элемент управления списком. Элемент Listbox состоит из одного элемента управления изображением и некоторого текстового блока.Бланк - черный Контроль изображения в WPF, если источник изображения абсолютный Uri

на источнике изображения я связать тип недвижимости Ури (абсолютный URL - например: http://u.aimg.sk/fotky/1730/71/17307141.jpg?v=2)

Listbox имеют около 50 - 300 пунктов.

Если я тестирую приложение, я иногда вижу пустое - белое или черное изображение вместо изображений пользователей.

Проблемы вы можете увидеть на этой картинке:

enter image description here enter image description here

Я хотел бы знать, что причина этой проблемы и как я могу решить эту проблему. Источник изображения хорош, я проверяю его в браузере.

Благодарим за совет.

+0

Примечание: Я попытался решить эту проблему, загрузив изображения локально (у меня ограниченное количество продуктов, поэтому это имело смысл в любом случае), но у меня все еще есть эта проблема. Таким образом, это определенно условие гонки, но не ограничивается сетевой активностью - и даже загрузка из локального URI файла. –

ответ

3

Я думаю, что происходит состояние гонки. Некоторые из ваших изображений не завершили загрузку к моменту, когда вы попросите их отобразить. Существует очень хороший пример, приведенный здесь http://social.msdn.microsoft.com/Forums/en/wpf/thread/dc4d6aa9-299f-4ee8-8cd4-27a21ccfc4d0 который я подытожить:

private ImageSource _Src; 

public ImageSource Src 
{ 
    get { return _Src; } 
    set 
    { 
    _Src = value; 
    if (PropertyChanged != null) 
     PropertyChanged(this, new PropertyChangedEventArgs("Src")); 
    ((BitmapImage)_Src).DownloadCompleted += new EventHandler(MainWindow_DownloadCompleted); 
    } 
} 

void MainWindow_DownloadCompleted(object sender, EventArgs e) 
{ 
    PropertyChanged(this, new PropertyChangedEventArgs("Src")); 
    ((BitmapImage)_Src).DownloadCompleted -= MainWindow_DownloadCompleted; 
} 

С выше коде, ваши образы, которые являются обязательными для вашего имущества будет сказано обновить с вызовом PropertyChanged, когда значение первого а также ПОСЛЕ того, как изображения загружены на 100%. Об этом заботится обработчик событий DownloadCompleted, который используется в приведенном выше примере. Это должно заставить их больше не выглядеть как черное изображение, а как их полностью готовые «я».

Кроме того, если вы используете поток в качестве источника для своих изображений, вам необходимо убедиться, что вы используете BitmapCacheOption.OnLoad. Такие, как:

BitmapImage source = new BitmapImage(); 
source.BeginInit(); 
source.CacheOption = BitmapCacheOption.OnLoad; 
source.StreamSource = yourStream; 
source.EndInit(); 

Это происходит потому, что по умолчанию изображение с помощью источника будет ленивая нагрузка он и тогда ваш поток, вероятно, закрыт, что также может быть, почему вы получаете пустые/черные изображения.

Удачи.