2013-08-18 3 views
1

Я пытаюсь обновить изображение, задав свойство source каждую секунду, однако это работает, но при обновлении мерцает.Обновление BitmapImage каждую секунду мерцает

CurrentAlbumArt = new BitmapImage(); 
CurrentAlbumArt.BeginInit(); 
CurrentAlbumArt.UriSource = new Uri((currentDevice as AUDIO).AlbumArt); 
CurrentAlbumArt.CreateOptions = BitmapCreateOptions.IgnoreImageCache; 
CurrentAlbumArt.EndInit(); 

Если я не установлю IgnoreImageCache, изображение не обновляется, таким образом, нет мерцания либо.

Есть ли способ обойти это предостережение?

Cheers.

+0

Вы можете сначала загрузить буфер изображения полностью, а затем создать MemoryStream из этого буфера и, наконец, создать новый BitmapImage и назначить его свойство «StreamSource». – Clemens

+0

Я пробовал делать это с помощью BmpBitmapEncoder, однако он вызывает одно и то же мерцание. – bl4kh4k

+0

Почему кодировщик? Вы хотите декодировать изображение. Я приведу примерный код. – Clemens

ответ

2

Следующий фрагмент кода загружает весь буфер изображения до, устанавливая свойство изображения Source для нового BitmapImage. Это должно устранить любые мерцания.

var webClient = new WebClient(); 
var url = ((currentDevice as AUDIO).AlbumArt; 
var bitmap = new BitmapImage(); 

using (var stream = new MemoryStream(webClient.DownloadData(url))) 
{ 
    bitmap.BeginInit(); 
    bitmap.CacheOption = BitmapCacheOption.OnLoad; 
    bitmap.StreamSource = stream; 
    bitmap.EndInit(); 
} 

image.Source = bitmap; 

Если загрузка занимает некоторое время, имеет смысл запустить ее в отдельном потоке. Затем вам следует позаботиться о правильном доступе к перекрестным потокам, также позвонив Freeze в BitmapImage и назначив Source в диспетчере.

var bitmap = new BitmapImage(); 

using (var stream = new MemoryStream(webClient.DownloadData(url))) 
{ 
    bitmap.BeginInit(); 
    bitmap.CacheOption = BitmapCacheOption.OnLoad; 
    bitmap.StreamSource = stream; 
    bitmap.EndInit(); 
} 

bitmap.Freeze(); 
image.Dispatcher.Invoke((Action)(() => image.Source = bitmap)); 
+0

Спасибо Клеменсу, даже не подумав об использовании WebClient. Приветствия. – bl4kh4k