连续输入时不要引发 TextChanged

2024-03-25

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

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

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


我已经多次遇到这个问题,根据我自己的经验,到目前为止,我发现这个解决方案简单而简洁。它是基于Windows Form但可以转换为WPF easily.

怎么运行的:

When TypeAssistant得知一个text change发生了,它就会运行一个计时器。后WaitingMilliSeconds计时器升高Idle事件。通过处理这个事件,你可以做任何你想做的工作(比如处理输入的文本)。如果另一个text change发生在从计时器启动的时间开始的时间范围内,并且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);
    }
}

Usage:

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();
    }
}

优点:

  • Simple!
  • 在工作WPF and Windows Form
  • 使用 .Net Framework 3.5+

缺点:

  • 运行另外一个线程
  • 需要调用而不是直接操作表单
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

连续输入时不要引发 TextChanged 的相关文章

  • 改变 RGB 颜色的色调

    我正在尝试编写一个函数来改变 RGB 颜色的色调 具体来说 我在 iOS 应用程序中使用它 但数学是通用的 下图显示了 R G 和 B 值如何随色调变化 看起来 编写一个函数来改变色调似乎应该是一个相对简单的事情 而不需要对不同的颜色格式进
  • 了解子表单何时关闭

    我有一个带有按钮的 Form1 当您单击按钮时 将执行以下代码块 Form2 frm new Form2 frm Name Form musteriNumarasi ToString frm Text Kullan c musteriNum
  • for 和 while 循环中没有循环条件

    while cond fine for cond fine 但是当我删除条件部分时 while syntax compilation error for Infinite loop 这些循环内部是如何实现的 或者 编译器 解析器 如何知道中
  • 在 Eclipse 4.4.2 中使用 C 代码中的构建变量

    我有一个之前使用 Eclipse 3 5 2 创建的项目 在其中 我能够在项目属性中设置构建变量 在这种情况下 假设我设置了SW VERSION是 4403 现在这应该是一个十六进制数字 所以在构建设置中 我添加了一个符号 VERSION
  • 序列化 .NET WCF 服务的类型时出现问题:服务 WSDL 在 XSD 中定义空类型

    我正在使用 WCF 编写一个 Web 服务 我创建了数据合约 我创建了我的服务合同 界面 我定义了方法 其参数的类型与数据契约相同 我实现了创建服务类的服务合同 我使用 svc 文件和 IIS 托管我的服务 我尝试了我的服务 寻找http
  • 无效的跨线程访问问题

    我有两个 ViewModel 类 PersonViewModel 和 PersonSearchListViewModel PersonViewModel 实现的字段之一是通过 WCF 下载的个人资料图像 本地缓存在独立存储中 PersonS
  • 慢速 WPF 文本框

    我正在开发一个简单的串行数据查看器 它将用于观察传输到计算机串行端口之一的数据 我使用 C 和 WPF 编写了一个测试应用程序 它只是将最近读取的行放入文本块中 但是 它会跳过所有其他行 我的理论是 在 WPF 渲染窗口之前 新数据会被放入
  • 在大型数据绑定 ObservableCollection 中添加/删除许多项目,而无需冻结 GUI

    我和我的团队正在开发一个 WPF 应用程序 该应用程序显示多个并发 XamDataChart 控件 由 Infragistics 提供 每个图表都绑定到不同的 ObservableCollection 最多可包含 200 万个点 对于每个图
  • 在 C 中使用另一个结构中的二维结构数组的编码问题

    我正在使用一个二维结构数组 它是另一个结构的一部分 这不是我做过很多事的事情 所以我遇到了问题 该函数在接近末尾的 测试 for 循环后最终失败 它在出现段错误之前正确打印出一行 我的代码中将数据读入虚拟二维结构数组的部分工作得很好 所以它
  • 如果键不是映射中的初始化键,STL map[key] 返回什么? [复制]

    这个问题在这里已经有答案了 这是一些示例代码 include
  • STL(标准模板库)中使用的设计模式

    我正在学习STL和设计模式 我想知道是否有任何文档或链接可以解释如何在 STL 中实现设计模式 我做了谷歌但无法获得太多数据 我希望你的意思是 哪些设计模式可以在STL中识别 STL 堆栈是一个容器适配器 适配器是一种设计模式 迭代器也是一
  • 将 KeyUp 作为参数传递 WPF 命令绑定文本框

    我有一个文本框 KeyUp 事件触发器连接到 WPF 中的命令 我需要将按下的实际键作为命令参数传递 该命令执行得很好 但处理它的代码需要知道按下的实际键 记住这可能是一个回车键或不仅仅是一个字母的任何键 所以我无法从 TextBox te
  • 同时重新排序和旋转图像的高效方法

    为了快速加载 jpeg 我为turbojpeg 实现了一个 mex wrapper 以有效地将 大 jpeg 读入 MATLAB 对于 4000x3000px 的图像 实际解码只需要大约 120 毫秒 而不是 5 毫秒 然而 像素顺序是 R
  • 使用 CryptUnprotectData 解密 WEP wlan 配置文件密钥

    我正在尝试使用解密 WEP 配置文件的密钥加密解除数据保护 http msdn microsoft com en us library windows desktop aa380882 28v vs 85 29 aspx 我获取配置文件密钥
  • 如何在 C# 中读取 Visio 文档内容

    我的DLL库代码如下 using System using IVisio Microsoft Office Interop Visio namespace Emix public class Visio protected String p
  • C# 中 WinForm TextBox 中数字的按键事件

    我想限制用户在文本框中仅输入数字 我在按键事件中添加此代码 private void txtPartID KeyPress object sender KeyPressEventArgs e if e KeyChar gt 0 e KeyC
  • 在源代码和预编译二进制文件之间切换

    我们的应用程序中有大量的库 库是用 C 或 C 编写的 平台 net Framework Windows 64 位 将所有内容编译为源代码需要花费大量时间 我们正在考虑切换到预构建的二进制文件 但我们仍然希望保留返回源代码的可能性 作为版本
  • 使用 JSON.NET 反序列化一些 JSON

    我对 JSON 非常陌生 我需要解析 API 提供的一些内容 谷歌快速搜索出现了JSON NET http james newtonking com pages json net aspx 所以我现在尝试使用它将此 JSON 解析为列表对象
  • 如何在 MVC 5 中设置自定义 ClaimsPrincipal?

    我创建了一个自定义主体类 public class FacebookPrincipal ClaimsPrincipal public JObject Data get set 我想用它 当用户登录时 我尝试设置 var fbP new Fa
  • 如何包装实体框架以在执行前拦截 LINQ 表达式?

    我想在执行之前重写 LINQ 表达式的某些部分 我在将重写器注入正确的位置时遇到问题 实际上根本没有 查看实体框架源代码 在反射器中 它最终归结为IQueryProvider Execute在 EF 中 它通过以下方式耦合到表达式Objec

随机推荐

  • 如何让 Eclipse 使用现有的 svn 工作副本?

    我已经用 svn 签出了一份工作副本 此外 我在 Eclipse 中创建了一个新项目 该项目将工作副本的根目录作为项目的位置 我希望能够执行诸如比较 Eclipse 版本之类的操作 我有 Subclipse 1 4 8 但这似乎没有给我我想
  • 为什么没有 64 位版本的 Visual Studio 2010?

    我在msdn下载中只看到x86版本 里科 马里亚尼 http blogs msdn com ricom archive 2009 06 10 visual studio why is there no 64 bit version aspx
  • 私有与受保护 - 可见性良好实践问题[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我一直在寻找 我知道理论上的区别 public 任何类 函数都可以访问该方法 属性 受保护的 只有此类和任何子类可以访问方法 属性 privat
  • 在启动 Express 服务器之前等待几个数据库连接?

    我正在开发一个 Express 应用程序 启动时 它连接到 Redis 服务器和 PostgreSQL 服务器 我想在启动 Express 服务器之前等待两个连接都成功 现在 如果我只是等待one回调 我可以在该回调中启动 Express
  • F#:管道与作曲与......作曲?

    我对一切都很陌生 F 一般编程以及这个社区 我是一名数学家 在本科期间曾短暂接触过计算机科学 我正在尝试用 F 完成一些任务 F 备忘单 http dungpa github io fsharp cheatsheet 展示了三种不同的函数组
  • Jetpack 仅撰写粗体字符串占位符

    我有一个像这样的字符串资源
  • 这段代码如何使用保留关键字作为字段名称?

    我在遗产中发现了以下结构java字节码在尝试解决服务器应用程序启动问题时 我的 IDE 反编译了一些第三方库 我很好奇这如何有效 以前从未见过keywords可以用作字段名称在字节码中 字节码版本为 48 0 Java 1 4 public
  • 使用 pydev 中的 unittest 在 Python 中对整个项目层次结构进行单元测试

    我正在使用 unittest 模块对一些使用 Pydev 在包的分层结构中创建的 python 代码进行单元测试 当我尝试在 pydev 中对实际源代码及其单元测试使用单独的源文件夹时 问题就出现了 project src com myse
  • IBAN 验证检查

    我需要使用 JavaScript 进行 IBAN 验证检查 我需要遵循的规则是 验证 IBANIBAN 的验证方法是将其转换为整数并对其执行基本 mod 97 运算 如 ISO 7064 中所述 如果 IBAN 有效 则余数等于 1 检查国
  • Flexbox:居中元素,两侧有空间元素

    我正在使用 Flexbox 设置一个由七个组成的菜单 li 具有不同宽度的元素 我想要我的中间 源顺序中的第四个 li li 元素始终作为一种锚点水平居中 第 1 3 个元素 li li 元素占据居中左侧的空间 li li 第 5 7 个占
  • 如何将 LESS 集成到 ZendFramework 2 中

    我已经发现本教程 https stephen rees carter net thought integrating less with zend framework the easy way这是为了Zend框架1 我下载少了放在下面项目
  • 如何知道特定的 launchd .plist 文件位置?

    是否可以知道由加载的 plist 文件位置launchctl命令 标签名称列出为launchctl list其内容可以通过以下方式查看launchctl list LABEL 但我找不到 plist 文件位置 我知道它将位于 Library
  • 关于使用 iostream 进行解析的准则是什么?

    我发现自己最近写了很多解析代码 大部分是自定义格式 但并不真正相关 为了增强可重用性 我选择将解析函数基于 I O 流 以便我可以将它们与诸如boost lexical cast lt gt 然而 我意识到我从未在任何地方读过有关如何正确执
  • ASP.NET MVC 如何在不重写 URL 的情况下处理 Application_Error 的 404 错误

    我创建了一个非常简单的 ASP NET MVC 5 应用程序 我想在其中处理我的 404 异常Application Error如图所示这个问题 https stackoverflow com questions 7501810 net m
  • 有没有办法阻止 pandas to_json 添加 \?

    我正在尝试将 pandas 数据帧发送到 json 但我遇到了一些日期问题 我得到了一个额外的 以便我的记录看起来像Updated 09 06 2016 03 09 44 是否可以不添加这个额外的 我假设它是某种转义字符 但我无法找到与此相
  • Laravel 5.3 - InvalidArgumentException 查看 [索引] 未找到 [重复]

    这个问题在这里已经有答案了 I 已经部署我的 Laravel 应用程序到我的VPS 它在本地主机上运行良好 我认为错误出在我的路由中 或者可能是控制器中 因为路径仍然进入我的本地计算机目录 请参阅错误消息第 2 行 但我确实看不到代码中的问
  • 在 MySQL 中使用 JOIN 时避免出现不明确的列错误

    我的查询如下所示 sql SELECT u s FROM bands u inner join statuses s on u status id s id WHERE u status id 1 ORDER BY u band name
  • CGBitmapContextCreate:不支持的参数组合

    我正在尝试创建一个 8 位灰度上下文 如下所示 CGColorSpaceRef colorSpace CGColorSpaceCreateDeviceGray CGContextRef context CGBitmapContextCrea
  • Interface Builder:如何清理已删除的约束?

    我使用命令删除来删除 IB 中地图视图小部件的一些约束 正如附图所示 约束实际上只是褪色 而不是完全删除 我已经尝试过保存文件并重新打开项目 但似乎它们不会被 XCode 删除 我怎样才能将它们删除 EDIT 这是我在尺寸检查器窗口中看到的
  • 连续输入时不要引发 TextChanged

    我有一个相当大的文本框 TextChanged事件处理程序 在正常打字条件下 性能还不错 但当用户执行长时间连续操作时 例如按住退格按钮一次删除大量文本 它可能会明显滞后 例如 事件需要 0 2 秒才能完成 但用户每 0 1 秒执行一次删除