首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误:必须在与DependencyObject相同的线程上创建DependencyObject,即使使用Dispatcher

错误:必须在与DependencyObject相同的线程上创建DependencyObject,即使使用Dispatcher
EN

Stack Overflow用户
提问于 2014-10-14 12:38:46
回答 1查看 33.1K关注 0票数 39

下面是我的View的一部分,其中我将图像绑定到ViewModel中的一个属性

代码语言:javascript
复制
<Image Source="{Binding Image}"  Grid.Column="2" Grid.ColumnSpan="2"/>

我的ViewModel是:

代码语言:javascript
复制
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

我在谷歌上搜索了很多,所以我看到了这篇文章,但他们都不适合我。

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-14 13:18:22

BitmapImageDependencyObject,所以它是在哪个线程上创建的,因为您不能访问在另一个线程上创建的对象的DependencyProperty,除非它是Freezable对象,并且可以对其进行Freeze

使当前对象不可修改,并将其IsFrozen属性设置为true。

您需要做的是在更新Freeze之前调用Image

代码语言:javascript
复制
bi.BeginInit();
bi.StreamSource = ms;
bi.EndInit();
bi.Freeze();

Dispatcher.CurrentDispatcher.Invoke(() => Image = bi);

正如@AwkwardCoder指出的,这里是Freezable Objects Overview

票数 104
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26361020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档