WPF ile yeni başlayan ve teknolojiye aşina olmak için bir ev projesi deniyorum. Kullanıcının bir görüntü dosyasını seçtiği basit bir formum var, daha sonra EXIF verilerini resmin küçük resmi ile birlikte görüntüliyorum. Bu iyi çalışıyor ama bir RAW görüntü dosyası (~ 9 MB) seçtiğimde başparmak yüklendiğinde hafif bir gecikme olabilir, bu yüzden görüntüyü çözmek için BackgroundWorker'ı kullanabileceğimi düşündüm ve kullanıcı EXIF verilerini görüntüleyebilir, sonra görüntü çözüldüğünde görüntülenir.WPF/BackgroundWorker ve BitmapSource problemi
BitmapSource nesne BackgroundWorkers DoWork yönteminde ilan edilir:
worker.DoWork += delegate(object s, DoWorkEventArgs args)
{
string filePath = args.Argument as string;
BitmapDecoder bmpDecoder = BitmapDecoder.Create(new Uri(filePath), BitmapCreateOptions.None, BitmapCacheOption.None);
BitmapSource bmpSource = bmpDecoder.Frames[0];
bmpSource.Freeze(); //As suggested by Paul Betts
args.Result = bmpSource;
};
ben bir hata alırsınız RunWorkerCompleted yönteminde benim Görüntü kontrolünün kaynağını ayarlamak çalıştığımda içine çalıştırıyorum sorundur Nesne başka bir iş parçacığına ait olduğu için.
worker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args)
{
imgThumb.Source = args.Result as BitmapSource;
};
Kaynağını ayarlamak için imgThumb.Dispatcher.BeginInvoke()
yöntemi kullanarak çalıştı ama bu da işe yaramadı, ben imgThumb
başka bir iş parçacığı tarafından sahip olunan args.Result
, ve değil çünkü sanırım? Bunu nasıl başarabilirim?
Bu benim Dispatcher'ımı yanlış kodluyor olabilir (aşağıdaki bellekten, sahip olduğum şeyi sildim).
imgThumb.Dispatcher.Invoke(new Action<BitmapSource>(
delegate(BitmapSource src)
{
imgThumb.Source = src;
}
), bmpSource);
Herhangi bir öneri veya fikir bekliyoruz.
Güncelleme
BitmapCreateOptions.None yerine .DelayCreation kullanmak benim DoWork yöntemini değiştirdi ancak RAW dosyalarını yüklerken şimdi aşağıdaki hatayı alıyorum (Canon .CR2 dosyaları bugüne kadar test ettik hepsi), kod jpg'ler için iyi çalışıyor. RAW dosyalarını görüntülemem için izin verdiğim Canon Codec ile bu bir sorun olabilir mi?
uygulaması, farklı parçacığı için sıraya konan bir arayüz adı. (HRESULT özel durum: 0x8001010E (RPC_E_WRONG_THREAD)) BitmapSource üzerinde
BitmapSource değerini ayarladıktan hemen sonra DoWork yöntemimde Freeze() çağrısını ekledim. Sonra aşağıdaki satırı RunWorkerCompleted yöntemine ekleyin: BitmapSource xx = args.Result; Bu bana önceki gibi aynı hatayı veriyor. Belli bir şey eksik miyim? Dispatcher'ı kullanarak herhangi bir kod çıkardım. – Fermin
Bir aptallık yapıyorum ama şimdi bir fark var. hata, güncellenmiş soru. – Fermin
Yıllar sonra bile. ÇOK TEŞEKKÜR EDERİM. Net – Kulpemovitz