c#用户输入后的时间延迟
本文关键字:时间延迟 输入 用户 | 更新日期: 2023-09-27 18:05:54
我有一个自定义控件(继承自TextBox),我正在使用。net 4.0
我需要能够做的是在用户完成输入后执行一些代码,例如在他停止输入后一秒钟。
我不能在每次Text改变的时候都执行这个代码块,为了效率,因为它有点耗时。理想情况下,它应该只在每次用户开始和停止输入时调用一次。我已经开始在OnTextChanged
方法中使用Stopwatch的Restart()
。
这是我的设置:
public class MyBox : TextBox
{
private readonly Stopwatch timer;
protected override void OnTextChanged(TextChangedEventArgs e)
{
timer.Restart();
base.OnTextChanged(e);
}
}
我怎样才能有效地做到这一点?异步线程是答案吗?还是有别的办法?
您可以轻松地使用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
}
}
使用延迟绑定。示例:
<StackPanel>
<TextBox Text="{Binding ElementName=TextBlock,
Path=Text,
Delay=1000}" />
<TextBlock x:Name="TextBlock" />
</StackPanel>
如果你的代码可以在一个单独的线程上运行,那么设计你的线程代码,这样它就可以通过杀死线程而被杀死。然后在每次按键时,杀死旧线程(如果它存在),用你的代码重新启动一个新线程。
注意:如果你的代码需要与UI线程交互,那么你必须确保调用回主线程,或者使用'UpdateStatus'调用,基本上为你做这些。
或者,你的计时器方法将工作,但有一个警告,当它执行时,主线程将被锁定,直到它完成,因此我的第一个建议是一个可终止线程。