visual valid studio net example documentacion comment comentarios code c# .net wpf multithreading xaml

valid - summary c# visual studio



Error: debe crear DependencySource en el mismo subproceso que DependencyObject incluso utilizando Dispatcher (1)

BitmapImage es DependencyObject por lo que importa en qué subproceso se haya creado porque no puede acceder a la DependencyProperty de DependencyProperty de un objeto creado en otro subproceso a menos que sea un objeto Freezable y puede Freeze .

Hace que el objeto actual no sea modificable y establece su propiedad IsFrozen en verdadero.

Lo que debes hacer es llamar a Freeze antes de actualizar Image :

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

Como lo señala @AwkwardCoder, aquí se encuentra la msdn.microsoft.com/en-us/library/ms750509(v=vs.110).aspx

Lo siguiente es parte de mi View en la que he enlazado una Imagen a una propiedad en mi ViewModel :

<Image Source="{Binding Image}" Grid.Column="2" Grid.ColumnSpan="2"/>

Mi ViewModel es este:

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)); } }

Mi problema: el problema es cuando quiero enlazar la imagen, me da el error

Debe crear DependencySource en el mismo subproceso que DependencyObject

He buscado mucho en Google y he visto el post en SO, pero ninguno de ellos funcionó para mí.

Cualquier tipo de ayuda sería muy apreciada.