2012-10-09 214 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個窗口,而不是先前的版本,一旦我點擊了「否」,我就得到了每個新窗口。 –