3

我正在尝试在 WPF 应用程序中显示来自 Kinect 的相机馈送。但是,图像显示为空白。

下面是我在 Kinect 类中的一个片段,这一切都正确触发,并且 BitmapSource 似乎创建得很好。

public delegate void FrameChangedDelegate(BitmapSource frame);
public event FrameChangedDelegate FrameChanged;


//this event is fired by the kinect service, and fires correctly

void sensor_AllFramesReady(object sender, AllFramesReadyEventArgs e)
    {
        using (ColorImageFrame colorFrame = e.OpenColorImageFrame())
        {
            if (colorFrame == null)
            {
                return;
            }

            byte[] pixels = new byte[colorFrame.PixelDataLength];

            colorFrame.CopyPixelDataTo(pixels);

            int stride = colorFrame.Width * 4;

            BitmapSource newBitmap = BitmapSource.Create(colorFrame.Width, colorFrame.Height,
                96, 96, PixelFormats.Bgr32, null, pixels, stride);
            counter++;

            //below is the call to the delegate

            if ( FrameChanged != null)
            {
                FrameChanged(newBitmap);
            }


        }
    }

这是我的 ViewModel 中的内容。

    void kinectService_FrameChanged(BitmapSource frame)
    {

        image = frame;
    }

    BitmapSource image;
    public BitmapSource Image
    {
        get { return this.image; }
        set
        {
            this.image = value;
            this.OnPropertyChanged("Image");
        }
    }

下面是我的 XAML 视图中的内容。

<Image Canvas.Left="212" Canvas.Top="58" Height="150" Name="image1" Stretch="Fill"     Width="200" Source="{Binding Path=Image}"/>

所有事件和属性似乎都已更新。我究竟做错了什么?

4

3 回答 3

2
image = frame;

应该:

Image = frame;

否则您的属性更改通知将不会触发。

于 2012-03-07T17:28:57.660 回答
1

尝试改变:

 void kinectService_FrameChanged(BitmapSource frame)
 {
    this.image = frame;
 }

 void kinectService_FrameChanged(BitmapSource frame)
 {
    this.Image = frame;
 }

因为您没有使用您的属性,PropertyChanged所以永远不会调用该事件,因此 UI 不会知道它需要获取新的图像值。

于 2012-03-07T17:29:48.963 回答
1

我不确定,但您不需要使用大写字母 I:

void kinectService_FrameChanged(BitmapSource frame)
{
   Image = frame;
}

忘了补充:这就是 WPF 卡住的原因。所有这些小陷阱和陷阱。我很少在应该防止绑定的应用程序中遇到“同步”问题,而现在我遇到了绑定本身的很多小问题。

于 2012-03-07T17:29:58.677 回答