3

我正在使用 Kinect 开发使用 C# 和 WPF 的图像查看应用程序。当用户将双手举过头顶时,我会显示Messagebox询问用户他/她是否真的想退出:

    //Quit if both hands above head
    if (skeleton.Joints[JointType.HandLeft].Position.Y > skeleton.Joints[JointType.Head].Position.Y &&
        skeleton.Joints[JointType.HandRight].Position.Y > skeleton.Joints[JointType.Head].Position.Y)
    {
        pause = true;
        quit();
    }

quit()功能如下:

    private void quit()
    {
        MessageBoxButton button = MessageBoxButton.YesNo;
        MessageBoxImage image = MessageBoxImage.Warning;
        MessageBoxResult result = MessageBox.Show("Are you sure you want to quit?", "Close V'Me :(", button, image);
        if (result == MessageBoxResult.Yes) window.Close();
        else if (result == MessageBoxResult.No)
        {
            pause = false;
        }

    }

pause变量用于在MessageBox仍处于活动状态时停止识别任何手势。(pause=false表示手势识别激活,否则没有。)

所以有两个问题:

  1. 显示MessageBox两次。如果我单击Yes其中任何一个,则window关闭。行为还可以,但我不想要两个窗口。

  2. 如果我单击NoMessageBox则会显示另一个。如果我单击No此框,则会打开另一个框。No这发生在我点击的每一个连续的地方。在大约显示 5-6 次后,它给了我想要的行为,即,它将pause变量的值更改为false,从而激活对其他手势的识别。

我到底做错了什么?我该怎么做才能停止一切并等待用户单击其中一个选项?另外为什么MessageBox显示多次(最初是两次,单击 时更多No)?

4

3 回答 3

2

如果不查看正在调试的代码,很难判断,但我猜测您的第一个代码块正在某种循环或事件处理程序中被调用,该处理程序正在处理最新的 Kinect 数据。

检查暂停

尝试在第一段代码上方添加类似这样的内容:

if (pause)
   return;

if (skeleton.Joints[JointType.HandLeft].Position.Y > skeleton.Joints[JointType.Head].Position.Y &&
    skeleton.Joints[JointType.HandRight].Position.Y > skeleton.Joints[JointType.Head].Position.Y)
{
    pause = true;
    quit();
}

超时

如果这不起作用,您可能需要添加自上次提示用户以来的超时时间。

private void quit()
{
    if (DateTime.Now.Subtract(_lastQuitTime).TotalSeconds > 5)
    {

          //Prompt the user

          //Reset the timeout
          _lastQuitTime = DateTime.Now;
    }
}
于 2012-10-09T12:48:34.277 回答
1

在您的代码中,我看不到任何阻止两次调用 quit 方法的内容。只需在quit方法的开头设置一个全局变量为true,最后再设置为false,并在调用quit之前检查它是否为false。

于 2012-10-09T12:49:35.480 回答
0

我在猜测这段代码是如何工作的,但试试这个:

//Quit if both hands above head
if (skeleton.Joints[JointType.HandLeft].Position.Y > skeleton.Joints[JointType.Head].Position.Y &&
    skeleton.Joints[JointType.HandRight].Position.Y > skeleton.Joints[JointType.Head].Position.Y &&
    !pause)
{
    pause = true;
    quit();
}
else
{
    pause = false;
}

...

private void quit()
{
    MessageBoxButton button = MessageBoxButton.YesNo;
    MessageBoxImage image = MessageBoxImage.Warning;
    MessageBoxResult result = MessageBox.Show("Are you sure you want to quit?", "Close V'Me :(", button, image);
    if (result == MessageBoxResult.Yes) window.Close();
    else if (result == MessageBoxResult.No)
    {
        pause = false;
    }

}
于 2012-10-09T12:50:53.467 回答