gpt4 book ai didi

c# - 连续打字时不要引发 TextChanged

转载 作者:可可西里 更新时间:2023-11-01 08:15:56 26 4
gpt4 key购买 nike

我有一个文本框,它有一个相当庞大的 _TextChanged 事件处理程序。在正常打字条件下,性能还可以,但当用户执行长时间的连续操作时,性能会明显滞后,例如按住退格键一次删除大量文本。

例如,事件用了 0.2 秒完成,但用户每 0.1 秒执行一次删除。因此,它无法 catch ,并且需要处理的事件会积压,从而导致 UI 滞后。

但是,事件不需要为这些中间状态运行,因为它只关心最终结果。有什么方法可以让事件处理程序知道它应该只处理最新的事件,而忽略所有以前的陈旧更改?

最佳答案

这个问题我遇到过好几次,根据我自己的经验,我发现这个解决方案到目前为止简单明了。它基于 Windows 窗体,但可以轻松转换为 WPF

工作原理:

TypeAssistant 得知发生了文本更改 时,它会运行一个计时器。在 WaitingMilliSeconds 之后,计时器引发 Idle 事件。通过处理这个事件,你可以做任何你想做的工作(比如处理输入的tex)。如果在从计时器启动时间开始到 WaitingMilliSeconds 之后的时间范围内发生另一个文本更改,则计时器将重置。

public class TypeAssistant
{
public event EventHandler Idled = delegate { };
public int WaitingMilliSeconds { get; set; }
System.Threading.Timer waitingTimer;

public TypeAssistant(int waitingMilliSeconds = 600)
{
WaitingMilliSeconds = waitingMilliSeconds;
waitingTimer = new Timer(p =>
{
Idled(this, EventArgs.Empty);
});
}
public void TextChanged()
{
waitingTimer.Change(WaitingMilliSeconds, System.Threading.Timeout.Infinite);
}
}

用法:

public partial class Form1 : Form
{
TypeAssistant assistant;
public Form1()
{
InitializeComponent();
assistant = new TypeAssistant();
assistant.Idled += assistant_Idled;
}

void assistant_Idled(object sender, EventArgs e)
{
this.Invoke(
new MethodInvoker(() =>
{
// do your job here
}));
}

private void yourFastReactingTextBox_TextChanged(object sender, EventArgs e)
{
assistant.TextChanged();
}
}

优点:

  • 简单!
  • 使用 WPFWindows Form
  • 使用 .Net Framework 3.5+

缺点:

  • 再运行一个线程
  • 需要调用而不是直接操作表单

关于c# - 连续打字时不要引发 TextChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33776387/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com