При связывании источника изображения с 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
событие никогда не будет вызвано, поэтому пользовательский интерфейс не будет знать, что ему нужно получить новое значение изображения.