При связывании источника изображения с BitmapSource изображение остается пустым

Я пытаюсь показать видео с камеры Kinect в приложении WPF. Однако изображение выглядит пустым.

Ниже приведен фрагмент того, что у меня есть в моем классе 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}"/>

Все события и свойства, кажется, обновляются. Что я делаю неправильно?

3 ответа

Решение
image = frame;

должно быть:

Image = frame;

в противном случае ваше уведомление об изменении свойства не сработает.

Я не уверен, но вам не нужно использовать заглавную букву I:

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

забыл добавить: вот почему застревает WPF. Все эти маленькие ловушки и ошибки. У меня редко возникали проблемы с синхронизацией в приложениях, которые должны предотвращать привязки, и теперь вместо этого я получаю массу небольших проблем с самой привязкой.

Попробуйте изменить:

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

в

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

Поскольку вы не используете свою собственность, PropertyChanged событие никогда не будет вызвано, поэтому пользовательский интерфейс не будет знать, что ему нужно получить новое значение изображения.

Другие вопросы по тегам