Пусто - черный контроль изображения в WPF, если источник изображения является абсолютным Uri - PullRequest
2 голосов
/ 04 февраля 2011

Я использую для управления списком собственных данных.Элемент списка состоит из одного элемента управления изображением и нескольких текстовых блоков.

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

Список содержит около 50–300 элементов.

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

Проблема, которую вы видите на этих изображениях:

enter image description here enter image description here

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

Спасибо за совет.

1 Ответ

3 голосов
/ 03 ноября 2011

Я думаю, что то, что происходит, - это состояние гонки. Некоторые из ваших изображений не были загружены к тому времени, когда вы просили их отобразить. Вот очень хороший пример, приведенный здесь 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();

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

Удачи.

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