我有一个自定义控件(继承自TextBox),我正在使用.NET 4.0。
我需要做的是在用户完成输入后执行一些代码,例如他停止打字后一秒钟。
为了提高效率,每次Text更改时都无法执行此代码块,因为它有点耗时。理想情况下,每次用户启动和停止键入时都应调用一次。我已经开始在Restart()
方法中使用Stopwatch的OnTextChanged
。
这是我的设置:
public class MyBox : TextBox
{
private readonly Stopwatch timer;
protected override void OnTextChanged(TextChangedEventArgs e)
{
timer.Restart();
base.OnTextChanged(e);
}
}
我该如何有效地做到这一点?异步线程的答案是什么?或者还有其他方式吗?
答案 0 :(得分: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
}
}
答案 1 :(得分:1)
使用Delay绑定。样品:
<StackPanel>
<TextBox Text="{Binding ElementName=TextBlock,
Path=Text,
Delay=1000}" />
<TextBlock x:Name="TextBlock" />
</StackPanel>
答案 2 :(得分:0)
如果你的代码可以在一个单独的线程上运行,那么设计你的线程代码,这样就可以通过杀死线程来杀掉它。然后在每次按键时,杀死旧线程(如果存在)并使用您的代码重新启动一个新线程。
注意:如果您的代码需要与UI线程进行交互,那么您必须确保调用回主线程,或者使用基本上为您执行此操作的“UpdateStatus”调用。
或者,你的计时器方法会起作用,但是当它执行时需要注意,主线程将被锁定直到它完成,因此我的第一个建议是终止线程。