Kir*_*met 3 c# wpf user-interface visual-studio
我有一个在用户在搜索框中输入时调用的函数.在实际执行函数之前,我想等待用户完成输入.我知道如何在JavaScript中通过超时轻松完成此任务,但我如何在C#中执行相同的操作?另外,在我假设用户输入完成之前,我应该等多久?100ms的?
如果您习惯使用Reactive(Rx)框架,那么您可以非常快速地使用其内置限制来实现此功能.
这是一篇关于这个主题的文章: Rx可以提高UI的响应能力
并且从文章中窃取和修改了一些代码:
var textObserver = (from text in Observable.FromEvent<TextChangedEventArgs>(_app.myTextField, "TextChanged")
select text).Throttle(TimeSpan.FromSeconds(.5));
_searchObserver = textObserver.Subscribe(textChangedEvent =>
{
var tb = (TextBox)textChangedEvent.Sender;
DoMySearch(tb.Text);
});
Run Code Online (Sandbox Code Playgroud)
正如文章中所述(值得完整阅读),这将在lambda表达式中触发代码,只要半秒钟没有用户输入任何内容.
我明天在我的开发PC面前清理这个例子,但这应该给你一个起点.
这是基于Loren输入的工作代码:
private void SearchTextBox_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)
{
if (SearchTextBoxTimer != null)
{
Console.WriteLine("The user is currently typing.");
if (SearchTextBoxTimer.Interval < 750)
{
SearchTextBoxTimer.Interval += 750;
Console.WriteLine("Delaying...");
}
}
else
{
Console.WriteLine("The user just started typing.");
SearchTextBoxTimer = new System.Windows.Forms.Timer();
SearchTextBoxTimer.Tick += new EventHandler(SearchTextBoxTimer_Tick);
SearchTextBoxTimer.Interval = 500;
SearchTextBoxTimer.Start();
}
}
Run Code Online (Sandbox Code Playgroud)
和事件处理程序:
private void SearchTextBoxTimer_Tick(object sender, EventArgs e)
{
Console.WriteLine("The user finished typing.");
if (SearchTextBox.Text == "")
{
ConsoleTextBox.Text = "Searching: All";
}
else
{
ConsoleTextBox.Text = "Searching: " + SearchTextBox.Text;
}
SearchTextBox_TextChanged();
SearchTextBoxTimer.Stop();
SearchTextBoxTimer.Dispose();
SearchTextBoxTimer = null;
}
Run Code Online (Sandbox Code Playgroud)
如果有人使用此代码,请告诉我您是否调整了我输入的时间间隔。我认为它们还不是最佳选择。