WPF - 从另一个线程更新“System.Windows.Controls.Image”

时间:2011-01-13 23:17:51

标签: c# .net wpf multithreading wpf-controls

我在该代码上遇到此异常。 如何解决?

Excepton:

  

调用线程无法访问它   对象,因为不同的线程拥有   它

代码:

    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 个答案:

答案 0 :(得分:7)

您可以冻结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);

    }

答案 1 :(得分:2)

您可以按照另一个线程中的建议冻结图像,这样可以消除线程限制,但会使图像不可变。

WPF/BackgroundWorker and BitmapSource problem