我试图在用户单击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)以确定它是否完成。