Отображение изображения WPF в фоновом режиме - PullRequest
0 голосов
/ 09 февраля 2011

Я использую WPF 3.5.

У меня есть цикл while в событии backgroundworker_DoWork, которое будет непрерывно передавать потоковые изображения из DSLR.

Первоначально потоковое изображение будет отображаться в PictureBox

<Grid>
    <WindowsFormsHost VerticalAlignment="Top" Background="Transparent" Height="500">
        <wf:PictureBox x:Name="picLiveView" />
    </WindowsFormsHost>
</Grid>

Вот код:

        while (!liveViewExit)
        {
            try
            {
                if (picImage != null)
                    lock (mylock)
                    {
                        this.picLiveView.Image = (Image)picImage.Clone();
                    }
            }
            catch
            {

            }
        }

Это прекрасно работает.

Однако, когда я пытаюсь изменить PictureBox на WPF Image control, у меня возникает эта ошибка, когда я назначаю BitmapImage для WPF image control:

{"Вызывающий поток не может получить доступ к этому объектупотому что он принадлежит другому потоку. "}

        MemoryStream ms = new MemoryStream();
        bmp.Save(ms, ImageFormat.Png);
        ms.Position = 0;
        BitmapImage bi = new BitmapImage();
        bi.BeginInit();
        bi.StreamSource = ms;
        bi.EndInit();

        try
        {
            if (bi != null)
            {
                this.imageBox.Source = bi;
            }
        }
        catch
        {

        }

Почему элемент управления .NET 2 PictureBox работает, а элемент управления .NET 3.5 WPF Image - нет?

Я попробовал этот код:

BackgroundWorker bg = new BackgroundWorker();
Dispatcher disp = Dispatcher.CurrentDispatcher;
bg.DoWork += (sender, e) =>
{
    // load your data
    disp.Invoke(new Action(/* a method or lambda that do the assignment */));
}
bg.RunWorkerCompleted += anotherMethodOrLambda; // optional
bg.RunWorkerAsync(/*an argument object that will be visible in e.Argument*/);

Нет ошибок, но изображение не обновляется.Цикл while делает приложение не отвечающим.

1 Ответ

2 голосов
/ 09 февраля 2011

вам нужно создать экземпляр объекта Dispatcher в главном потоке и использовать его в фоновом режиме, вызывая его метод Invoke.

Вот пример кода:

BackgroundWorker bg = new BackgroundWorker();
Dispatcher disp = Dispatcher.CurrentDispatcher;
bg.DoWork += (sender, e) =>
{
    // load your data
    disp.Invoke(new Action(/* a method or lambda that do the assignment */));
}
bg.RunWorkerCompleted += anotherMethodOrLambda; // optional
bg.RunWorkerAsync(/*an argument object that will be visible in e.Argument*/);
...