2017-05-18 27 views
-2

私はIATというプロジェクトに取り組んでいます。 2つの言葉では、上の隅に2つのカテゴリ(左、右)があり、これらのカテゴリに関連付けられた単語のリストが画面の中央にランダムに表示されます(単語は1つのカテゴリにのみ一致します)。 単語が中央に表示された後、プログラムは「停止」し、ユーザーがキーを押して単語をソートするまで待機する必要があります(左のカテゴリは左の矢印、右は右です)。ユーザーが答えを出した後、プログラムは答えに無駄な時間を数えます。次に、もう1つの単語が表示され、このプロセスは何度か繰り返されます。
要約すると、私はRedKey()に相当するものを作りたいと思います。デバッグ中は、while(true/stopwatch.IsRunning()/ etc)ループでプログラムが押されたキーに反応しないことに気付きました。プログラマーにユーザーの回答を待って反応させるにはどうすればよいですか。wpf key while while whileループ

+0

問題のあるコードを表示する必要があります。 UIスレッドでループを実行していますか?ユーザアクションを待っている間にタイムアウトを整理するために、単純な 'Timer'を使うことができます。時間を測定するには、 'Stopwatch'または' DateTime.Now'を使います。 – Sinatr

答えて

0

プログラムは単語を示しているとき、あなたは(でSystem.Timers.Timerを使用して)タイマーを起動する必要がありますが、そのEllapsedイベントを処理、ハンドラ内であなたのカウンターになる変数(どのくらいのユーザーの回答をインクリメントする必要があります質問) MainWindowのKeyDownイベントでは、押されたキーが左または右の矢印かどうかを確認できます。タイマーが有効な場合は、答えが用意されていることを知っています。ユーザーが矢印を押した秒数(もちろん、タイマーの間隔を調整する必要があります)。

ここではすべてがご質問があればちょうど頼む

<Label x:Name="label" Content="Right or left" HorizontalAlignment="Left" Margin="125,72,0,0" VerticalAlignment="Top"/> 

を動作することを示すために、(当然のちょうど質問ロジックなし)XAMLで

public partial class MainWindow : Window 
{ 
    Timer answerTimeTimer; // it's for counting time of answer 
    Timer questionTimer; // this is used for generating questions 
    int timeOfAnswer; 

    public MainWindow() 
    { 
     InitializeComponent(); 


     questionTimer = new Timer() 
     { 
      Interval = 2500 
     }; 


     answerTimeTimer = new Timer() 
     { 
      Interval = 1000 
     }; 

     answerTimeTimer.Elapsed += AnswerTimeTimer_Elapsed; 
     questionTimer.Elapsed += QuestionTimer_Elapsed; 

     questionTimer.Start(); 
    } 

    private void QuestionTimer_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     AskQuestion(); 
    } 

    private void AskQuestion() 
    { 
     //Your questions logic 
     Console.WriteLine("Question asked"); 
     Dispatcher.Invoke(new Action(() => label.Content = "Question asked")); // This line is just to update the label's text (it's strange because you need to update it from suitable thread) 
     answerTimeTimer.Start(); 
     questionTimer.Stop(); 
    } 

    private void AnswerTimeTimer_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     timeOfAnswer++; 
     Dispatcher.Invoke(new Action(() => label.Content = timeOfAnswer)); 
    } 

    private void Window_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.Left || e.Key == Key.Right) 
     { 
      if (answerTimeTimer.Enabled) 
      { 
       answerTimeTimer.Stop(); 
       //Here you can save the time from timeOfAnswer 
       Console.WriteLine("Question answered in " + timeOfAnswer); 
       Dispatcher.Invoke(new Action(() => label.Content = "Question answered in " + timeOfAnswer)); 
       timeOfAnswer = 0; // Reset time for the next question 
       questionTimer.Start(); 

      } 
     } 
    } 


} 

そして、ちょうど1ラベルを完全なコードを持っています: )