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ジェスチャ認識がアクティブであることを意味します。それ以外の場合はノーです。)

したがって、次の 2 つの問題があります。

  1. が2MessageBox回表示されます。Yesそれらのいずれかをクリックすると、windowが閉じます。動作は問題ありませんが、2 つのウィンドウは必要ありません。

  2. をクリックNoすると、別のMessageBox画面が表示されます。このボックスをクリックNoすると、別のボックスが開きます。これは、連続Noしてクリックするたびに発生します。約 5 ~ 6 回表示された後、必要な動作が得られます。つまり、pause変数の値が に変更falseされ、他のジェスチャの認識がアクティブになります。

私は正確に何を間違っていますか?すべてを停止して、ユーザーがいずれかのオプションをクリックするのを待つにはどうすればよいですか? また、なぜMessageBox複数回表示されるのですか (最初は 2 回、クリックするとそれ以上No)?

4

3 に答える 3

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;
    }
}
于 2012-10-09T12:48:34.277 に答える
1

あなたのコードには、quit メソッドの 2 回の呼び出しを妨げるものは何もありません。quit メソッドの先頭でグローバル変数を true に設定し、最後に再度 false に設定し、quit を呼び出す前に false かどうかを確認します。

于 2012-10-09T12:49:35.480 に答える
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;
    }

}
于 2012-10-09T12:50:53.467 に答える