3

我试图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弹出。TextBoxThread

我的问题是是否有某种缓冲区可以在 GUI 线程休眠时存储所有引发的事件?

4

1 回答 1

2

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

<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) 以确定它是否已完成。

于 2013-05-16T08:06:46.257 回答