wpf while循环中的keyDown

时间:2017-05-18 15:15:46

标签: c# wpf keydown onkeydown

我正在研究名为IAT的项目。用两个词来说,顶角有两个类别(左,右),与这些类别相关的单词列表随机显示在屏幕中央(1个单词只匹配一个类别)。 在中间显示单词后,程序应该"停止"然后等到用户按键对单词进行排序(左侧为左侧,右侧为右侧)。在用户给出答案后,程序将计算时间浪费在答案上。然后,显示另一个单词,这个过程继续进行几次迭代 总而言之,我想要相当于RedKey()。调试时我意识到程序对while(true / stopwatch.IsRunning()/ etc)循环中的按键没有反应。我应该怎么做才能使程序等待用户回答并做出反应。

1 个答案:

答案 0 :(得分:0)

当程序显示单词时,你应该启动计时器( 使用System.Timers.Timer ),处理它的Ellapsed事件,在处理程序中你必须增加变量将是你的柜台(用户回答问题多长时间) 然后在MainWindow的KeyDown事件中你可以检查按下的键是左箭头还是右箭头,然后如果启用了计时器,如果是,你知道问题已经准备好应答,现在只需停止计时器,你的计数器变量将显示用户按箭头的秒数(当然你必须调整Timer的间隔)。

这里有完整的代码(当然没有问题逻辑)

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();

            }
        }
    }


}

XAML中只有一个标签表明一切正常

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

如果您有任何问题,请询问:)