Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Messagebox会显示多次_C#_Wpf_Kinect_Messagebox_Gestures - Fatal编程技术网

C# Messagebox会显示多次

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

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

    //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个窗口,而不是以前的版本,我一次单击就获得每个新窗口<代码>否