找回密码
 立即注册

QQ登录

只需一步,快速开始

mindrayguowei

中级会员

122

主题

274

帖子

986

积分

中级会员

积分
986

活字格认证

QQ
mindrayguowei
中级会员   /  发表于:2016-9-1 16:30  /   查看:7713  /  回复:17
之前提过一个问题问的是如何禁止Ctrl-Z撤销, 但是有客户要求开放Ctrl-Z撤销功能

经测试发现有两个问题:
1. 由于界面上不是每个区域都是可输入的, 所以我添加了一个_textControl_InputPositionChanged事件, 但是这会导致撤销功能无效。
我又加了一个_textControl_KeyPress事件来捕捉Ctrl-Z事件,  经过调试发现,如果在按下了Ctrl-Z的时候没有触发InputPositionChanged事件,那么将导致撤销事件无效, 失去了撤销的效果。 但是又不是每次每次都不触发InputPositionChanged事件。 但是在去掉InputPositionChanged事件后, 又每次都能正确撤销了。 如何才能在保证界面某些区域只读的情况下, 又能保证撤销效果?

2.撤销级数问题, 我在模板加载完成后会在程序里面默认初始化一些Field对应的数据, 但是不断的做撤销操作会把我初始化好了的Field里面的数据也撤销掉。 是否存在一个撤销缓冲区, 当我初始化模板之后清空缓冲区, 这样就无法在撤销了。 或者有什么别的实现方式, 能不防止Field里面的数据被撤销掉?

附件里面是我的一个测试项目。可以重现第一个问题

TextControlTest.zip

123.95 KB, 下载次数: 97

17 个回复

正序浏览
gw0506
超级版主   /  发表于:2016-9-20 18:58:33
18#
最终有时和字符集有关~~~  看来这条经验需要铭记。哈哈~
回复 使用道具 举报
mindrayguowei
中级会员   /  发表于:2016-9-20 17:56:03
17#
这个是文件是二进制内容, 不能直接设置teableCell的Text吧?
我们发现是另外的问题, 模板保存的时候没有用InternalUnicodeFormat保存导致的.
这个问题基本已经解决, 暂时没有发现别的问题了
回复 使用道具 举报
gw0506
超级版主   /  发表于:2016-9-18 18:51:57
16#
问题在这一句:
  1. _textControl.Selection.Load(content, BinaryStreamType.InternalFormat);
复制代码

调2次 SetTableCellValue 的时候,第二次selection.load之后会覆盖第一次的数据,导致内部的undolist乱了。
你改一下,不要用load,直接设置teableCell的Text。这样就正常了。
回复 使用道具 举报
mindrayguowei
中级会员   /  发表于:2016-9-18 14:24:39
15#
撤销乱掉的demo,上传一个新的, 有一点点不同

TextControlTest.zip

149.97 KB, 下载次数: 61

回复 使用道具 举报
mindrayguowei
中级会员   /  发表于:2016-9-18 14:14:41
14#
本帖最后由 mindrayguowei 于 2016-9-18 14:16 编辑

你说的没有任何变化, 是 Ctrl + Z没有撤销成功, 还是没有乱掉?

我只要粘贴两次, 再  Ctrl + Z, 就会出现这样的问题F:\\1.jpg
就是说在框外面的检查所见会跑到框里面去
1.jpg
回复 使用道具 举报
gw0506
超级版主   /  发表于:2016-9-14 18:11:09
13#
我用这个demo,没有重现:
1. 运行应用
2. 点击多次粘贴按钮
3. 多次Ctrl+Z,没有任何变化。
blob995619201.png
回复 使用道具 举报
mindrayguowei
中级会员   /  发表于:2016-9-14 17:51:36
12#
这个Ctrl Z撤销还是有问题, 当我导入的是一个复杂的二进制串的时候, 再撤销就会导致模板乱掉. 附件里是新的demo, 我把数据库里面两个blob类型的字段数据写到了20 和30两个二进制文件里了, 点击粘贴后会把这两个文件的数据导入到模板中的两个框里面, 然后一撤销就乱了.

TextControlTest.zip

149.56 KB, 下载次数: 51

回复 使用道具 举报
gw0506
超级版主   /  发表于:2016-9-12 11:00:09
11#
mindrayguowei 发表于 2016-9-11 19:14
好像可以通过捕捉到Ctrl V事件来实现的

只取其中的PlainText是可以,不过也不完善。
1. 他会根据你粘贴到的位置前的样式走,应用到所有PlainText上。
2. 你需要处理键盘,还要处理contextmenu,也就是鼠标右键。
3. 需要判的条件似乎也不少,因为其他时候还是应该正常复制的,等于我们单独开了一个口子。

不过如果真的是需求必须这样,那也没办法了。不过我总觉得这个全选容易选中table的情况其实在Word里也一直有,所以用户应该可以理解。为了这个单独开个口子,总觉得风险多了一点。
回复 使用道具 举报
mindrayguowei
中级会员   /  发表于:2016-9-11 19:14:12
10#
好像可以通过捕捉到Ctrl V事件来实现的
  1. private void Form1_KeyDown(object sender, KeyEventArgs e)
  2.         {
  3.             if ((Control.ModifierKeys == Keys.Control) && (e.KeyCode == System.Windows.Forms.Keys.V))
  4.             {
  5.                 textControl1.Paste(TXTextControl.ClipboardFormat.PlainText);
  6.                 e.Handled = true;
  7.             }
  8.         }
复制代码
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部