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 に答える