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.