Meh*_*deh 27 .net c# wpf xaml multithreading
以下是我的一部分,我View将一个Image绑定到我的属性ViewModel:
<Image Source="{Binding Image}"  Grid.Column="2" Grid.ColumnSpan="2"/>
我的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中看过这个帖子但是他们都没有为我工作.
任何形式的帮助将非常感激.
dko*_*ozl 73
BitmapImageDependencyObject因为你无法访问DependencyProperty在另一个线程上创建的对象,所以它在哪个线程上创建是很重要的,除非它是一个Freezable对象而你可以Freeze.  
使当前对象不可修改并将其IsFrozen属性设置为true.
您需要做的是Freeze在更新之前调用Image:
bi.BeginInit();
bi.StreamSource = ms;
bi.EndInit();
bi.Freeze();
Dispatcher.CurrentDispatcher.Invoke(() => Image = bi);
正如@AwkwardCoder所指出的那样是Freezable Objects Overview
| 归档时间: | 
 | 
| 查看次数: | 20198 次 | 
| 最近记录: |