我正在使用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
表示手势识别处于活动状态,否则为。)
所以有两个问题:
MessageBox
显示两次。如果我在其中任何一个中点击Yes
,window
就会关闭。行为还可以,但我不想要两个窗口。
如果点击No
,则会显示另一个MessageBox
。如果我点击此框中的No
,则会打开另一个。我点击的每个连续No
都会发生这种情况。在大约显示5-6次之后,它给了我想要的行为,即它将pause
变量的值更改为false
,从而激活对其他手势的识别。
我究竟做错了什么?我该怎么做才能阻止一切并等待用户点击其中一个选项?另外为什么MessageBox
被多次显示(最初两次,当我点击No
时更多)?
答案 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;
}
}