我试图在用户单击TextBox后禁用Enter几秒钟:

<StackPanel>
    <TextBox x:Name="txt1" Width="150" Margin="10" KeyUp="txt1_KeyUp"/>
</StackPanel>

private void txt1_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Enter)
        {
            txt1.IsEnabled = false;
            Thread.Sleep(2500);
            txt1.IsEnabled = true; //all text is added here
        }
    }


如果我在Thread处于睡眠状态时继续键入,则TextBox“唤醒”时,我键入的所有内容都会在Thread中弹出。

我的问题是,如果GUI线程处于休眠状态,是否有某种缓冲区可以存储所有引发的事件?

最佳答案

这是一个更好的解决方案:

<StackPanel>
    <TextBox x:Name="txt1" Width="150" Margin="10" KeyUp="txt1_KeyUp"/>
</StackPanel>

private void txt1_KeyUp(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Enter)
    {
        txt1.IsEnabled = false;
        Thread t = new Thread(() =>
        {
            System.Threading.Thread.Sleep(2500);
            Action action = () => txt1.IsEnabled = true;
            Dispatcher.Invoke(action);
        });
        t.Start();
    }
}


您会看到按Enter键时,该框已禁用,并且您不在UI线程上睡觉。

如果希望其他UI元素知道何时完成,则可以将t(线程)保存到表单中,并可以查询其状态(t.ThreadState)以确定它是否完成。

09-05 03:29