错误:即使使用Dispatcher,也必须在与DependencyObject相同的Thread上创建DependencySource
以下是我的View
一部分,其中我将Image绑定到ViewModel
的属性:
我的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)); } }
我的问题:问题是当我想绑定Image时它会给我错误
必须在与DependencyObject相同的Thread上创建DependencySource
我已经google了很多,我已经在SO中看过这个post,但它们都没有为我工作。
任何forms的帮助将非常感激。
BitmapImage
是DependencyObject
因此它在创建它的哪个线程上很重要,因为你不能访问在另一个线程上创建的对象的DependencyProperty
,除非它是一个Freezable
对象并且你可以Freeze
它。
使当前对象不可修改并将其IsFrozen属性设置为true。
您需要做的是在更新Image
之前调用Freeze
:
bi.BeginInit(); bi.StreamSource = ms; bi.EndInit(); bi.Freeze(); Dispatcher.CurrentDispatcher.Invoke(() => Image = bi);
正如@AwkwardCoder所指出的,这里是Freezable Objects Overview