WPF RichTextBox TextChanged 事件 - 如何查找已删除或插入的文本?

2024-06-23

在使用 RichTextBox 创建自定义编辑器时,我遇到了使用 TextChanged 事件提供的信息查找已删除/插入文本的问题。

的实例文本更改事件参数 http://msdn.microsoft.com/en-us/library/system.windows.controls.textchangedeventargs_members.aspx有一些有用的数据,但我想它并不能满足所有需求。假设插入多个段落的场景,同时选定的文本(本身跨越多个段落)已被删除。

通过 TextChangedEventArgs 实例,您拥有文本更改的集合,每个更改仅向您提供删除或添加的符号的数量及其位置。

我想到的唯一解决方案是保留文档的副本,并对其应用给定的更改列表。但是由于 TextChange 的实例只提供了插入/删除符号的数量(而不是符号),因此我们在转换原始副本时需要放置一些特殊符号(例如“?”)来表示未知符号文档。

将所有更改应用到文档的原始副本后,我们可以将其与 RichTextBox 的更新文档进行比较,并找到未知符号与真实符号之间的映射。最后,得到我们想要的!

以前有人尝试过这个吗?我需要您对整个策略的建议,以及您对这种方法的看法。

Regards


这主要取决于您对文本更改的使用。当序列包含插入和删除时,理论上不可能知道每个插入的细节,因为插入的一些符号可能随后被删除。因此,您必须选择您真正想要的结果:

  • 出于某些目的,您必须知道确切的sequence即使某些插入的符号必须保留为“?”,也会发生变化。
  • 出于其他目的,您必须确切地知道新文本与旧文本有何不同,但不知道更改的确切顺序。

我将采用技巧来实现这些结果。我过去曾使用过这两种技术,所以我知道它们是有效的。

为了得到准确的序列

如果您要实现历史记录或撤消日志或搜索特定操作,则这更合适。

对于这些用途,您描述的过程可能是最好的,有一个可能的更改:而不是“查找未知符号和真实符号之间的映射”,只需向前运行扫描以查找每个“删除”的文本,然后运行它向后查找每个“插入”的文本。

换句话说:

  1. 从初始文本开始并按顺序处理更改。对于每个插入,插入“?”符号。对于每次删除,删除指定数量的符号并将其记录为删除的文本。

  2. 从最终文本开始,并以相反的顺序处理更改。对于每个delete, 插入 '?'符号。对于每个insert,删除指定数量的符号并将其记录为插入的文本。

完成此操作后,据我们所知,所有“插入”和“删除”更改条目都将具有关联文本,并且插入并立即删除的任何文本都将是“?”符号。

为了得到差异

这更适合修订标记或版本比较。

对于这些用途,只需使用文本更改信息来计算可能在其中找到更改的一组整数范围,然后使用标准 diff 算法来查找实际更改。这在处理增量更改方面往往非常有效,但仍然为您提供最佳更新。

当您粘贴与原始段落几乎相同的替换段落时,这特别好:使用文本更改信息将指示整个段落是新的,但使用 diff(即此技术)将仅标记那些实际上是的符号运行不同的。

计算变化范围的代码很简单:将变化表示为四个整数(oldstart、oldend、newstart、newend)。运行每个更改:

  1. 如果changestart在newstart之前,则将newstart减少到changestart,并减少oldstart等量
  2. 如果changeend在newend之后,则将newend增加到changeend,并增加oldend等量

完成此操作后,从旧文档中提取范围 [oldstart, oldend] 并从新文档中提取范围 [newstart, newend],然后使用标准 diff 算法对它们进行比较。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF RichTextBox TextChanged 事件 - 如何查找已删除或插入的文本? 的相关文章

  • WPF 位图到图像的转换仅显示黑色图像

    我确实在以 wpf Image 形式显示图像 uEye Cam 时遇到一些问题 显示的 图像全黑 下面是我使用的代码 Get Cam Bitmap Image var cam new uEye Camera cam Init cam Mem
  • WPF:名称空间中不存在该名称[重复]

    这个问题在这里已经有答案了 我正在使用 VS2013 构建 C WPF 应用程序 并且具有以下类定义 在正在运行的应用程序的同一程序集中 namespace MyNamespace public class MyKey public MyK
  • DataGrid 是 WPF 中的必需品吗?

    我看到很多讨论正在进行 人们询问 WPF 的 DataGrid 并抱怨 Microsoft 迄今为止还没有在其 WPF 框架中提供 DataGrid 我们知道 WPF 是一项出色的 UI 技术 并且具有 ItemsControl DataT
  • 使用 MVVM 时 XamDataGrid 列可见性不起作用

    我正在尝试在 MVVM 架构中实现 XamDataGrid 列可见性 但它似乎不起作用 我正在执行以下操作 为未绑定字段添加可见性属性
  • WPF RichTextBox 中的只读 Run 元素?

    我可能完全是在想象这一点 但我可以发誓有一种方法可以使 RichTextBox 中的各个 Run 或 Parapgraph 元素成为只读 我还可以发誓 几周前我自己尝试了一种方法 并对结果感到满意 我隐约记得它看起来像这样
  • wpf 按钮悬停渐变不起作用

    我在 wpf 中使用带有渐变背景的按钮 但鼠标悬停时背景不起作用 我的代码有什么问题吗
  • C# WPF - 应用程序图标 + ShowInTaskbar = False

    我创建了一个具有以下属性的自定义分层 WPF 窗口 允许透明度 True 在任务栏显示 False 背景 透明 最上面 True 图标 图标 ico 我已在 项目属性 gt 应用程序 选项卡下添加了 Icon ico 如果 ShowInTa
  • Windows 更新 KB4040972/73 导致 WPF 类出现黑色图像

    我有一个依赖于深度缩放图像 从 PNG 转换为各种比例的 JPG 金字塔 的应用程序 我们使用 DeepZoomTools dll 来实现 这依赖于PresentationCore dll 多年来一直运行良好 推出 KB4040972 和
  • 如何重新启动 WPF 应用程序?

    如何从代码重新启动 WPF 应用程序 在 Windows 窗体中存在 Application Restart 但出于某种原因 Microsoft 决定不在 WPF 中添加此方法 我讨厌 WPF 和 Windows 窗体之间的不兼容 喜欢 w
  • DockPanel 选项卡顺序

    我在 ItemsControl 的 DataTemplate 中设置了一个 DockPanel 如下所示
  • 基于 PHP 的 CSV 编辑器? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道用 PHP 编写的在线 CSV 编辑器允许用户打开 编辑和保存给定的 CSV 文件 我能找到的只
  • WPF TreeView:如何像在资源管理器中一样使用圆角设置所选项目的样式

    WPF TreeView 中的所选项目具有带有 尖 角的深蓝色背景 今天看来有点过时了 我想将背景更改为 Windows 7 资源管理器中的样子 带 不带焦点 到目前为止我所尝试的并没有删除原来的深蓝色背景 而是在其顶部绘制了一个圆形边框
  • C# ObservableCollection OnCollectionChanged 在项目更改时不会触发

    来自 MSDN 关于 OnCollectionChanged 的 内容 在添加 删除 更改 移动项目或刷新整个列表时发生 我正在更改附加到位于我的集合中的 obj 的属性 但 OnCollectionChanged 未触发 我正在 obj
  • 如何动态设置 WPF DataGridCell 样式

    我有一个 DataGrid 其 itemsSource 定义如下 dg ItemsSource new ObservableCollection
  • 关闭时发送到托盘

    单击关闭按钮时如何将最小化的窗口发送到托盘 另外 如何在应用程序启动时在托盘中显示图标 WinForm 一种方法是在窗口的 F ormClosing 事件中设置 FormClosingEventArgs 的 Cancel 属性 然后最小化到
  • 如何从不同的进程关闭窗口

    我有一个 C 应用程序 我想指示它从不同的进程中很好地关闭 我还希望能够要求它打开主窗口 我有一个对其主窗口句柄的引用 我知道我可以使用远程处理或 WCF 等复杂的方案来做到这一点 问题是我可以使用更简单的机制 例如窗口消息 或 c 应用程
  • ControlTemplate 或 DataTemplate 内的自定义资源字典

    编辑 使用标准 NET ResourceDictionary 时也会出现此问题 并且似乎是在控件或数据模板内使用资源字典时出现的问题 我有一个自定义资源字典 它遵循共享资源实例的通用方法 http softnotes wordpress c
  • KeyEventArgs.Key 到 char

    有没有办法转换WPF的KeyEventArgs Key to Char 我尝试使用KeyInterop var x Char KeyInterop VirtualKeyFromKey e Key 对于数字和字母 它可以正常工作 但对于其他字
  • MVVM 同步集合

    是否有一种标准化方法可以将 Model 对象集合与 C 和 WPF 中匹配的 ModelView 对象集合同步 我正在寻找某种类 可以使以下两个集合保持同步 假设我只有几个苹果 并且可以将它们全部保存在内存中 换句话说 我想确保如果我将 A
  • WPF 复选框状态不会在固定页面中更新

    我正在尝试导出一些基于在 WPF 中用作模板的固定页面元素的数据 并且我在更新复选框的值时似乎遇到问题 奇怪的是 我还在模板中使用了文本块和文本框 但这些在更新其内容时没有问题 所以 从一开始 我想要导出的数据位于名为 RepairStat

随机推荐