Ошибка: необходимо создать DependencySource в том же потоке, что и DependencyObject, даже с помощью Dispatcher

Следующее является частью моего View, в котором я привязал изображение к свойству в ViewModel:

My ViewModel:

public class MainWindowViewModel : INotifyPropertyChanged
{ public BitmapImage Image { get { return _image; } set { _image = value; OnPropertyChanged(); } } Action _makeScannerAlwaysOnAction; private BitmapImage _image; public MainWindowViewModel() { AddNewPersonCommand = new RelayCommand(OpenFrmAddNewPerson); FingerPrintScannerDevice.FingerPrintScanner.Init(); MakeScannerAlwaysOn(null); } private void MakeScannerAlwaysOn(object obj) { _makeScannerAlwaysOnAction = MakeScannerOn; _makeScannerAlwaysOnAction.BeginInvoke(Callback, null); } private void Callback(IAsyncResult ar) { FingerPrintScannerDevice.FingerPrintScanner.UnInit(); var objFingerPrintVerifier = new FingerPrintVerifier(); objFingerPrintVerifier.StartVerifingProcess(); var ms = new MemoryStream(); ms.Position = 0; objFingerPrintVerifier.MatchPerson.Picture.Save(ms, ImageFormat.Png); var bi = new BitmapImage(); bi.BeginInit(); bi.StreamSource = ms; bi.EndInit(); Thread.Sleep(2000); Dispatcher.CurrentDispatcher.Invoke(() => Image = bi); //Image = bi; _makeScannerAlwaysOnAction.BeginInvoke(Callback, null); } private void MakeScannerOn() { while (true) { if (FingerPrintScannerDevice.FingerPrintScanner.ScannerManager.Scanners[0].IsFingerOn) { return; } } } public event PropertyChangedEventHandler PropertyChanged; [NotifyPropertyChangedInvocator] protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { var handler = PropertyChanged; if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); }
}

Моя проблема: Проблема в том, что когда я хочу связать изображение, он дает мне ошибку

Должен создать DependencySource в том же потоке, что и DependencyObject

У меня много googled, и я видел пост в SO, но ни один из них не работал у меня.

любая помощь будет очень оценена.

1 ответ

BitmapImage есть DependencyObject, поэтому имеет значение, в каком потоке он создан, потому что вы не можете получить доступ к DependencyProperty объекта, созданного в другом потоке, если это не Freezable, и вы можете Freeze его.

Делает текущий объект немодифицируемым и устанавливает его свойство IsFrozen в true.

Что вам нужно сделать, это вызвать Freeze перед обновлением Image:

bi.BeginInit();
bi.StreamSource = ms;
bi.EndInit();
bi.Freeze();
Dispatcher.CurrentDispatcher.Invoke(() => Image = bi);

как указано @AwkwardCoder, здесь Обзор замороженных объектов

licensed under cc by-sa 3.0 with attribution.