考虑以下情况:有一个 ComboBox 和一个筛选 TextBox,当用户在文本框中输入文本时,ComboBox 的项源会使用筛选文本进行更新。一切都运作正常,但是过滤器在每个输入的字母上都会发生。我想在过滤器应用之前添加延迟(当用户正在输入时不应用过滤器)。最简单的方法是什么?
最常用的做法是引入一个计时器,每当用户输入一个新字符时,您的时间跨度就会被重置,但如果超过x秒,则执行代码。
记得要异步执行,这样如果用户在执行搜索时再次开始输入,您可以取消异步调用,因为该信息现在已过时。
如果您正在使用视图模型,请将textbox1_TextChanged更改为相应的属性设置器。
private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
{
if (!tmr.Enabled)
{
tmr.Enabled = true;
tmr.Start();
}
TimeSinceType = DateTime.Now;
}
public DateTime TimeSinceType { get; set; }
protected void Load()
{
tmr = new Timer();
tmr.Interval = 200;
tmr.Elapsed += new ElapsedEventHandler(tmr_Elapsed);
}
void tmr_Elapsed(object sender, ElapsedEventArgs e)
{
if ((DateTime.Now - TimeSinceType).Seconds > .5)
{
Dispatcher.BeginInvoke((Action)delegate()
{
//LoadData();
tmr.Stop();
});
}
}
现在可以通过直接在绑定上设置延迟来更轻松地完成此操作:
<ComboBox Text={Binding MyBinding, Delay=200} />