2

.NET 4.0で使用しているカスタムコントロール(TextBoxから継承)があります。

私ができる必要があるのは、ユーザーが入力を終了した後、たとえば入力を停止してから1秒後に、コードを実行することです。

効率のため、また多少時間がかかるため、テキストが変更されるたびにこのコードブロックを実行することはできません。理想的には、ユーザーが入力を開始および停止するたびに1回だけ呼び出す必要があります。メソッド内でStopwatchを使用することから始めました。Restart()OnTextChanged

これが私の設定です:

public class MyBox : TextBox
{
    private readonly Stopwatch timer;

    protected override void OnTextChanged(TextChangedEventArgs e)
    {
        timer.Restart();

        base.OnTextChanged(e);
    }
}

どうすればこれを効率的に行うことができますか?非同期スレッドが答えですか?または他の方法はありますか?

4

3 に答える 3

7

DispatcherTimerを使用して簡単に行うことができます:

public class MyBox : TextBox
{
    private readonly DispatcherTimer timer;

    public MyBox()
    {
        timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) };
        timer.Tick += OnTimerTick;
    }

    protected override void OnTextChanged(TextChangedEventArgs e)
    {
        timer.Stop();
        timer.Start();
    }

    private void OnTimerTick(object sender, EventArgs e)
    {
        timer.Stop();
        // do something here
    }
}
于 2013-03-25T21:07:34.393 に答える
1

遅延を伴うバインディングを使用します。サンプル:

<StackPanel>
    <TextBox Text="{Binding ElementName=TextBlock, 
                            Path=Text, 
                            Delay=1000}" />
    <TextBlock x:Name="TextBlock" />
</StackPanel>
于 2014-08-20T17:41:45.227 に答える
0

コードを別のスレッドで実行できる場合は、スレッドを強制終了することでコードを強制終了できるように、スレッドコードを設計します。次に、キーを押すたびに、古いスレッド(存在する場合)を強制終了し、コードを使用して新しいスレッドを再起動します。

注:コードがUIスレッドと対話する必要がある場合は、必ずメインスレッドに戻るか、基本的にそれを行う「UpdateStatus」呼び出しを使用する必要があります。

または、timerメソッドは機能しますが、実行時の注意点により、メインスレッドは実行が完了するまでロックされるため、終了可能なスレッドを最初に提案します。

于 2013-03-25T21:04:19.537 に答える