WPF - обновление "System.Windows.Controls.Image" из другого потока - PullRequest
3 голосов
/ 14 января 2011

Я получаю это исключение для этого кода.Как это исправить?

Исключение:

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

Код:

    void CamProc_NewTargetPosition(IntPoint Center, System.Drawing.Bitmap image)
    {
        IntPtr hBitMap = image.GetHbitmap();
        BitmapSource bmaps = Imaging.CreateBitmapSourceFromHBitmap(hBitMap, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());

        Dispatcher.BeginInvoke((Action)(() =>
        {
            labelX.Content = String.Format("X: {0}", Center.X); //OK Working
            labelY.Content = String.Format("Y: {0}", Center.Y); //OK Working
            pictureBoxMain.Source = bmaps; // THERE IS EXCEPTON
        }), DispatcherPriority.Render, null);

    }

pictureBoxMain - это System.Windows.Controls.Image.

Ответы [ 2 ]

7 голосов
/ 14 января 2011

Вы можете заморозить BitmapSource, чтобы к нему можно было получить доступ из любого потока:

void CamProc_NewTargetPosition(IntPoint Center, System.Drawing.Bitmap image)
    {
        IntPtr hBitMap = image.GetHbitmap();
        BitmapSource bmaps = Imaging.CreateBitmapSourceFromHBitmap(hBitMap, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
        bmaps.Freeze();

        Dispatcher.BeginInvoke((Action)(() =>
        {
            labelX.Content = String.Format("X: {0}", Center.X);
            labelY.Content = String.Format("Y: {0}", Center.Y);
            pictureBoxMain.Source = bmaps;
        }), DispatcherPriority.Render, null);

    }
2 голосов
/ 14 января 2011

Вы можете заморозить изображение, как предложено в другом потоке, что избавляет от ограничения потоков, но делает изображение неизменным.

Проблема WPF / BackgroundWorker и BitmapSource

...