2

我有一个在 .NET 4.0 中使用的自定义控件(继承自 TextBox)。

我需要做的是在用户完成输入后执行一些代码,例如在他停止输入后一秒钟。

每次 Text 更改时,我都无法执行此代码块,为了提高效率并且因为它有点耗时。理想情况下,每次用户开始和停止输入时,它应该只被调用一次。我已经开始在方法中使用StopwatchRestart()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”调用。

或者,您的计时器方法将起作用,但在执行时需要注意,主线程将被锁定直到它完成,因此我第一个建议可终止线程。

于 2013-03-25T21:04:19.537 回答