C# Messagebox会显示多次
我正在使用Kinect开发一个使用C#和WPF的图像查看应用程序。当用户将双手举过头顶时,我会显示一个C# Messagebox会显示多次,c#,wpf,kinect,messagebox,gestures,C#,Wpf,Kinect,Messagebox,Gestures,我正在使用Kinect开发一个使用C#和WPF的图像查看应用程序。当用户将双手举过头顶时,我会显示一个消息框,询问用户是否真的想退出: //Quit if both hands above head if (skeleton.Joints[JointType.HandLeft].Position.Y > skeleton.Joints[JointType.Head].Position.Y && skeleton.Joints[JointTyp
消息框
,询问用户是否真的想退出:
//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
表示手势识别处于活动状态,否则为否。)
因此有两个问题:
消息框将显示两次。如果我在其中任何一个中单击Yes
,则窗口将关闭。行为正常,但我不想要两扇窗户
No
,将显示另一个MessageBox
。如果我单击此框上的No
,则会打开另一个框。每次单击No
,都会发生这种情况。大约显示5-6次后,它会给我想要的行为,即将pause
变量的值更改为false
,从而激活对其他手势的识别我到底做错了什么?如何停止所有操作并等待用户单击其中一个选项?另外,为什么要多次显示
MessageBox
(最初显示两次,单击No
时显示更多)?如果不查看正在调试的代码,很难判断,但我猜您的第一个代码块是在处理最新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;
}
}
在您的代码中,我看不到任何阻止两次调用quit方法的东西。只需在quit方法开始时将全局变量设置为true,然后在结束时再次设置为false,并在调用quit之前检查它是否为false。我正在猜测这段代码是如何工作的,但请尝试以下操作:
//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;
}
}
这可能是因为quit()是synchron。因此,如果事件发生在代码处理quit()时,它可能会查询手在某处的事件。对不起,我不知道什么是同步方法。但问题已经解决。谢谢:)精确复制@Kinected你可以说它很相似,但绝对不是精确复制品。我多次使用标志来停止显示
messagebox
,这与问这个问题的人不同。我问这个问题的原因是,即使使用了一个标志,我还是多次收到了messagebox
。你是对的。它在处理程序(OnSkeletonFrameReady
)中使用,该处理程序检查SkeletonFrame
是否就绪。你给出的第一个解决方案完美无瑕!但我仍然不知道它改变了什么,最初是什么错误。@KaranThakkar-最初,您将“暂停”设置为“真”,但在“防止再次显示对话框”时未使用该值。让我澄清一下。return
所做的是,它跳出处理程序并再次进入处理程序?return退出当前方法。这与使用if(!pause){if(skeleton.Joints…}在该方法中包装其余代码相同。同步是一种处理可由多个线程访问的数据的技术(在您的示例中就是这样).多线程编程是一个非常深入的主题。如果你想深入到兔子洞,一个很好的起点是。有关同步的详细信息,请参阅我在@KendallFrey尝试了此解决方案,但它只会增加问题。现在我一次获得所有5-6个窗口,而不是以前的版本,我一次单击就获得每个新窗口<代码>否。