这是一个silverlight我做的用户控制(它是从实际生产代码中提取的,完美无缺地工作),它完全符合您的需求:对输入进行一定的延迟作出反应。它使用事件来模仿“textchanged”。调整它到Windows窗体很简单。
public partial class DelayedTextBox : UserControl
{
private DispatcherTimer eventTimer = new DispatcherTimer();
public double TextChangedDelay
{
get { return eventTimer.Interval.TotalMilliseconds; }
set { eventTimer.Interval = TimeSpan.FromMilliseconds(value); }
}
public delegate void DelayedTextChangedHandler(object sender, RoutedEventArgs e);
public event DelayedTextChangedHandler DelayedTextChange;
private object relayedSender = null;
private RoutedEventArgs relayedE = null;
public string Text
{
get
{
return PlainTextBox.Text;
}
set
{
PlainTextBox.Text = string.IsNullOrEmpty(value) ? string.Empty : value;
}
}
//----------------------------------------------------------------------------------------------
public TimedTextChangedTextBox()
{
InitializeComponent();
TextChangedDelay = 500;
eventTimer.Tick += new EventHandler(eventTimer_Tick);
}
private void StartTimer(object sender, RoutedEventArgs e)
{
relayedSender = sender;
relayedE = e;
eventTimer.Start();
}
private void StopTimer()
{
eventTimer.Stop();
relayedSender = null;
relayedSender = null;
}
private void eventTimer_Tick(object sender, EventArgs e)
{
StopTimer();
if (DelayedTextChange != null)
DelayedTextChange(relayedSender, relayedE);
}
private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
{
if (!maskedInput)
ReactToInput(sender, e);
}
private void ReactToInput(object sender, RoutedEventArgs e)
{
if (!eventTimer.IsEnabled)
{
StartTimer(sender, e);
}
else
{
StopTimer();
StartTimer(sender, e);
}
}
}
您可以使用与您通常使用TextBox完全相同的方式控制。订阅其DelayedTextChange
事件以对用户输入做出反应。
TextChanged不是那么好的地方。它发生在每个输入的字符上,并且可能会产生无效的值。例如用户必须输入一个数字和一个测量单位。输入“1”后,引发TextBox.Changed,并且检查例程会将其视为错误,因为缺少测量。 – Fischermaen
你当然是对的,但它是他可以使用的最基本的实现.. :) – Abbas
不要强迫人们使用计时器,这很丑。 – Fischermaen