2017-05-18 21 views
-2

저는 IAT라는 프로젝트를 진행하고 있습니다. 두 단어의 상단 모서리에는 2 개의 카테고리가 있고 (왼쪽, 오른쪽),이 카테고리와 연결된 단어 목록이 화면 중앙에 무작위로 표시됩니다 (단어 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(); 

      } 
     } 
    } 


} 

그리고 단 하나 개의 레이블 (하지 않고는 물론 논리에 의문을 제기) :)