日期:2014-05-17  浏览次数:20983 次

|ZYCWPF| 如何实时录制和共享RichTextBox数据 谢谢
如,我有这样的一个需求:
教师打开程序界面有一个RichTextBox,和一个共享按钮
点击共享按钮后,在学生客户端可以共享教师端的RichTextBox数据
用:string innerText = System.Windows.Markup.XamlWriter.Save(richContent.Document);取得RichTextBox的数据
以下为要求:
1:当老师在RichTextBox有更改时进行发送同步
2:将老师的整个播放录制下来,也就是说到时要对都是操作进行回放

我自己想到的同步录制实现(因为第一闪RichTextBox有变化都同步我感觉不太可能,因为这个RichTextBox可能比较大,所以用计时器来判断差异)
1:当教师点击共享按钮后,启动一个记录RichTextBox的记时器
2:这个记时器每1秒去读取RichTextBox的内容,
3:计时器读出来的数据和上一次读取出来的数据进行对比,如果不同,则将当前数据进行同步到学生端,但在数据库中保存当前时间和当前内容的一条记录

回放的方法为:
从数据库中按时间读出原来保存的时间和内容信息,并根据时间戳将相应记录的内容显示到RichTextBox中

以上的方法大体能实现我要的功能,但有一个不足是,每一次保存都是保存当时的整个信息,
而不是保存差异,这样在同步共享数据的时候每次都得发送整个RichTextBox的内容

麻烦看一下这方法是否可行,有没有更好的办法

谢谢
------最佳解决方案--------------------
看包不包括图片。
如果只是文字,在TextChanged事件中也不必每次都传送变更,检测到UndoAction为Create后再传递,本行的小的变化该行为都会是Merge,不用传送,只记录结尾位置。当UndoAction为Create时,记录下OffSet,在下一次Create时,根据前面记录的结尾位置传送变更内容。
如果包括图片,分为粘贴的还是通过文件对话框嵌入的,如果是前者就需要在UndoAction为Create时看看粘贴图片和键入文字有什么区别,或者干脆取消粘贴功能,都采用通过文件对话框嵌入,这样容易控制,执行嵌入操作时记录位置,传送位置和图片数据就行了。
------其他解决方案--------------------
建议保存差异。在TextChange中编写。

文本差异算法参考:http://www.cnblogs.com/grenet/archive/2010/06/01/1748448.html 其中的编辑距离(LD算法)。
------其他解决方案--------------------
ER 看了好高深
------其他解决方案--------------------
不高深,这个算法我在csdn贴过,一下找不到了。。。
------其他解决方案--------------------
这个算法有个缺陷,就是比如
123
123123
无法真实再现是123后输入了123,还是1和3之间粘贴了231。但是总之能够准确还原每一步的结果。

还有个办法,就是继承一个类,拦截键盘操作、复制粘贴、Text属性更改等,写起来麻烦,技术简单。但是要考虑很多细节,否则就不对了。
------其他解决方案--------------------
引用:
这个算法有个缺陷,就是比如
123
123123
无法真实再现是123后输入了123,还是1和3之间粘贴了231。但是总之能够准确还原每一步的结果。

还有个办法,就是继承一个类,拦截键盘操作、复制粘贴、Text属性更改等,写起来麻烦,技术简单。但是要考虑很多细节,否则就不对了。

拦截的不太好,因为我只是要记录显示的结果,并不要这些操作(如打字效果),这样的话还得去判断太复杂
第一个方法明天有时间我试试
谢谢
------其他解决方案--------------------
引用:
看包不包括图片。
如果只是文字,在TextChanged事件中也不必每次都传送变更,检测到UndoAction为Create后再传递,本行的小的变化该行为都会是Merge,不用传送,只记录结尾位置。当UndoAction为Create时,记录下OffSet,在下一次Create时,根据前面记录的结尾位置传送变更内容。
如果包括图片,分为粘贴的还是通过文件对话框嵌入的,如果是前者就需要在Undo……

楼上说的非常有道理,这样我还可以不用定时器。
直接 在UndoAction为Create的时间记录时间段和发送信息就可以了
哈哈
------其他解决方案--------------------
不行:
UndoAction为Create
的话只有输入数字和英文的时候不会触发
但是输入中文的话还是会触发
谢谢
------其他解决方案--------------------
我详细说一下吧。
首先要了解的是TextBase的Undo列表的机制,什么情况下会Create,什么情况下会Merge。这样你就能明白为什么要在Create的时候再发送更改,基本上这是发送过去的更改是一个完整的UI,比如Run、段落、或者Image。
发送的更改数据包无非包括以下内容:Offset、增加的文字,删除的文字,增加的图片,删除的图片、其他UI的增删。每次Undo的Create前发送包含上述数据的上一个Undo内容,接受方很容易做出同等的更改。
通过Offset可以获得TextPointer,也就可以获得其内容。TextChanged方法的e参数包括了发生变化的TextChange集合,集合每个元素的Offset,增加的符号的长度,删除的符号的长度,Undo是Merge还是Create,你可以从中获得发生更改的所有内容。如果Undo是Merge而不是Create,Offset+长度计算结束位置即可,配合Create时的Offset,很容易得到更改的内容。
你帖子中所说的转为Xaml、全文对比、定时器这些是很有“力量感”的做法,但程序要的是准确、稳定、快速,你应该修正你的原有思路。
------其他解决方案--------------------
该回复于2012-12-06 14:19:39被版主删除