Я - новичок с WPF и попыткой домашнего проекта познакомиться с технологией. У меня есть простая форма, где пользователь выбирает файл изображения, я затем отображаю данные EXIF наряду с миниатюрой изображения. Это хорошо работает, но когда я выбираю НЕОБРАБОТАННЫЙ файл изображения (~9 МБ), там может быть небольшая задержка, в то время как ползунок загружается, таким образом, я думал, что мог использовать BackgroundWorker для декодирования изображения, и пользователь может просмотреть данные EXIF, затем когда изображение декодировалось, это отображено.
Объект BitmapSource объявляется в методе BackgroundWorkers DoWork:
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;
};
проблема, с которой я сталкиваюсь, состоит в том, когда я пытаюсь установить источник своего управления Изображением в методе RunWorkerCompleted, я получаю ошибку, потому что объект принадлежит другому потоку.
worker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args)
{
imgThumb.Source = args.Result as BitmapSource;
};
Я пытался использовать imgThumb.Dispatcher.BeginInvoke()
метод для установки источника, но это не работало также, я предполагаю, что это - потому что это args.Result
это принадлежит другому потоку, а не imgThumb
? Как я могу обойти это?
Могло случиться так, что я кодировал своего Диспетчера неправильно (следующее из памяти, я удалил то, что я имел).
imgThumb.Dispatcher.Invoke(new Action<BitmapSource>(
delegate(BitmapSource src)
{
imgThumb.Source = src;
}
), bmpSource);
Любые предложения или идеи приветствуются.
Обновление
Измененный мой метод DoWork для использования BitmapCreateOptions. Ни один, а не.DelayCreation, но теперь я получаю следующую ошибку при загрузке НЕОБРАБОТАННЫХ файлов (файлы Canon.CR2 все, что я протестировал до настоящего времени), код хорошо работает для jpg's. Это могло быть проблемой с Кодеком Canon, который я установил, чтобы позволить мне отображать НЕОБРАБОТАННЫЕ файлы?
Приложение назвало интерфейс, который был упорядочен для другого потока. (Исключение из HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))
Вызов Freeze () на Bitmapsource, и у вас не будет этой проблемы (замораживание избавляется от ограничений на резьбу, но делает объект неизменным)