Удаление EventHandler не показывает никакого эффекта - PullRequest
0 голосов
/ 09 декабря 2011

Я хотел приостановить VideoStream от Kinect. Кнопка имеет следующий код:

if (capturing==0)
{
    try
    {
        // Signing the Event for Image frame ready
        nuiRuntime.VideoFrameReady += new EventHandler<ImageFrameReadyEventArgs>(nuiRuntime_VideoFrameReady);
        nuiRuntime.DepthFrameReady += new EventHandler<ImageFrameReadyEventArgs>(nuiRuntime_DepthFrameReady);
        nuiRuntime.VideoStream.Open(ImageStreamType.Video, 2, ImageResolution.Resolution640x480, ImageType.Color);
        nuiRuntime.DepthStream.Open(ImageStreamType.Depth, 2, ImageResolution.Resolution320x240, ImageType.Depth);
    }
    catch
    {
        Dialogs.ShowWarning("An Error occured. Check, if the Kinect is connected properly.");
    }
    finally
    {
        capturing = 2;
    }
}
else if (capturing == 1)
{
    nuiRuntime.VideoFrameReady += new EventHandler<ImageFrameReadyEventArgs>(nuiRuntime_VideoFrameReady);
    nuiRuntime.DepthFrameReady += new EventHandler<ImageFrameReadyEventArgs>(nuiRuntime_DepthFrameReady);
    capturing = 2;//go on after break 
}
else
{
    nuiRuntime.VideoFrameReady -= new EventHandler<ImageFrameReadyEventArgs>(nuiRuntime_VideoFrameReady);
    nuiRuntime.DepthFrameReady -= nuiRuntime_DepthFrameReady;
    capturing = 1;//pause
}

Я не думаю, что это трудно понять. Состояния: 0, Kinect не инициализирован, сделайте так 1, Kinect приостановлен, продолжайте 2, Kinect обычно захватывает

Но: когда выполняется «else», изображение в GUI (WPF.Image) по-прежнему показывает движущийся видеопоток. В «остальном» есть 2 способа, я пытался сделать это перерыв. Затем должно отображаться неподвижное изображение.

Конечно, я просто могу сказать EventHandler: если мы находимся в состоянии 1, просто не работаем над изображением, но я не думаю, что это чистый способ реализации.

Кто-нибудь может увидеть мою ошибку?

1 Ответ

0 голосов
/ 09 декабря 2011

Обработчики событий - это ссылочные типы (делегаты), которые вы добавляете в событие

nuiRuntime.VideoFrameReady += new EventHandler<ImageFrameReadyEventArgs>(nuiRuntime_VideoFrameReady);

- это не то же самое, что вы удаляете из него:

nuiRuntime.VideoFrameReady -= new EventHandler<ImageFrameReadyEventArgs>(nuiRuntime_VideoFrameReady);

Исправлениепросто, держите экземпляр обработчика где-нибудь:

var handler = new EventHandler<ImageFrameReadyEventArgs>(nuiRuntime_VideoFrameReady);

, затем добавьте / удалите тот же экземпляр:

nuiRuntime.VideoFrameReady += handler;
nuiRuntime.VideoFrameReady -= handler;

Кстати, код, который вы используете в блоке "else":

nuiRuntime.DepthFrameReady -= nuiRuntime_DepthFrameReady;

- это то же самое, что и

nuiRuntime.DepthFrameReady -= new EventHandler<ImageFrameReadyEventArgs>(nuiRuntime_DepthFrameReady);

Компилятор просто сделает за вас new EventHandler<>.

...