yty 发表于 2017-9-1 13:53:28

Paragraph类 自定义标记问题

本帖最后由 yty 于 2017-9-1 14:51 编辑

现有一需求如下。使用TextControl控件加载一文档,其分为若干段落。用户自由编辑该文档,我想在代码中获得用户修改了哪一个段落,并在内存中为该段落对象打上一个标记。举例说明,加载了一文档,包含5个段落,这时若遍历TextControl.Paragraphs属性,我可以获得5个Paragraph类的实例的引用。假设用户向第二段新增了一个字符,也就是第二段的任意内容被修改,我的需求就是,在代码中给第二个Paragraph实例以任何方式打上一个标记,表示其已被修改。在某一时点我将用到这些数据,例如我能获取到段落2、3已被修改。

实现此需求的方案与困难如下:
1. Paragraph类缺少一个类似Tag或UserData的属性,方便开发者把对象与任意自定义数据关联起来。
2. 若想自己实现一个Tag属性,考虑用Dictionary<Paragraph, MyTag>,但这要求Paragraph类能够可靠地引用到,但实际测试发现,每次遍历TextControl.Paragraphs得到的Paragraph实例是完全不同的全新实例,无法做到引用相等,甚至连续调用两次 TextControl.Paragraphs.GetItem 所获取的两个实例是引用不等的,追踪不到引用,便无法实现自定义这个字典。
3. 我定义自己的类,例如class MyTaggedParagraph ,具有Index和Tag两个属性,每次用户编辑操作时,获取输入点位置,找到相应的类实例,并打上标签。但是实际上用户可进行的编辑操作种类实在太多了,比如大块的粘贴、选择大块区域后覆盖输入,很可能会影响到段落的增、删、移动;要追踪每一种操作对于段落对象集合的增、删、移动情况太多,算法复杂,几乎是不可能的。
综上,有没有好的办法能可靠地跟踪到段落对象,并能在编辑操作时为该段落对象打上标记?

Richard.Ma 发表于 2017-9-1 23:31:50

控件本身Paragraph无法支持该功能,实际上我这边能想到的思路也就是这些,也没有其他更好的办法解决。
页: [1]
查看完整版本: Paragraph类 自定义标记问题