2012-10-09 184 views
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. 如果点击No,则显示另一个MessageBox。如果我在此框上点击No,另一个会打开。这发生在我点击的每个连续的No。在大约显示5-6次后,它给了我想要的行为,即它将pause变量的值更改为false,从而激活对其他手势的识别。

我究竟做错了什么?我能做些什么来阻止一切,并等待用户点击其中一个选项?此外,为什么MessageBox会多次显示(最初两次,当我点击No时更多)?

+0

可能这是因为退出()是SYNCHRON。所以如果事件发生时代码进程退出()它可能会查询手中的事件在某处。 – TGlatzer

+0

对不起,但我不完全知道同步方法是什么。但问题已解决。谢谢:) –

+0

精确复制http://stackoverflow.com/questions/10489581/c-sharp-and-kinect-gesture-time – Kinected

回答

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; 
    } 
} 
+0

@Downvoter - 这个答案有什么问题? – RQDQ

+0

你说得对。它被用在一个处理程序('OnSkeletonFrameReady')中,该程序检查'SkeletonFrame'是否准备就绪。 而你给出的第一个解决方案完美无缺!但我仍然无能为力,因为它最初发生了什么变化,什么是错误的。 –

+0

谁投了票? :/ –

1

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

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; 
    } 

} 
+0

@MikeBrown感谢我试过这个解决方案@KendallFrey但它只是增加的问题。现在,我一次性得到所有5-6个窗口,而不是先前的版本,一旦我点击了“否”,我就得到了每个新窗口。 –