Messagebox多次显示

时间:2012-10-09 12:40:14

标签: c# wpf kinect messagebox gestures

我正在使用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显示两次。如果我在其中任何一个中点击Yeswindow就会关闭。行为还可以,但我不想要两个窗口。

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

  3. 我究竟做错了什么?我该怎么做才能阻止一切并等待用户点击其中一个选项?另外为什么MessageBox被多次显示(最初两次,当我点击No时更多)?

3 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:1)

在代码中,我看不到任何阻止调用quit方法的内容。只需在quit方法开始时将全局变量设置为true,并在结尾处再次设置为false,并在调用quit之前检查它是否为false。

答案 2 :(得分: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;
    }

}