找回密码
 立即注册

QQ登录

只需一步,快速开始

mindrayguowei

中级会员

122

主题

274

帖子

986

积分

中级会员

积分
986

活字格认证

QQ
mindrayguowei
中级会员   /  发表于:2016-9-1 16:30  /   查看:9062  /  回复: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, 下载次数: 231

17 个回复

倒序浏览
gw0506
超级版主   /  发表于:2016-9-1 17:04:10
沙发
你的demo中需要一个 D:\\test.tx 所以我跑不起来。
说你的问题啊,
1. 你的inputpostionchanged事件里做了try catch,如果catch到就跳出了,断了原有内部逻辑,所以失效。那么我需要知道你家inputpostionchanged是处理什么case的?

2. 你全部处理完了之后,调一下ClearUndo。应该就清楚了缓存了。实在不行可以先把canUndo关上,设置完了再打开。
回复 使用道具 举报
mindrayguowei
中级会员   /  发表于:2016-9-2 13:12:12
板凳
我的DEMO里面包含了TX文件, 你手工放到D盘根目录下就好了
inputpostionchanged是为了判断焦点是否在table框里面, 如果在table框里面, 整个页面就可写。
如果在外面, 就只读
回复 使用道具 举报
gw0506
超级版主   /  发表于:2016-9-5 15:17:16
地板
mindrayguowei 发表于 2016-9-2 13:12
我的DEMO里面包含了TX文件, 你手工放到D盘根目录下就好了
inputpostionchanged是为了判断焦点是否在table ...

原因找到了,当你撤销的时候,inputpostion变了,进到事件中,这是根据你的逻辑设置了EditMode,这一步操作就进入了撤销队列。在inputpostionchanged事件中加一句判断就好了。
  1.                 if (tb != null && (tb.ID == STUDY_RESULT_TABLE_ID || tb.ID == DIAG_RESULT_TABLE_ID))
  2.                 {
  3.                     if (this._textControl.EditMode != TXTextControl.EditMode.Edit)
  4.                     {
  5.                         _textControl.EditMode = TXTextControl.EditMode.Edit;
  6.                         _textControl.Selection.Bold = false;
  7.                     }

  8.                     //_textControl.Selection.ListFormat.Type = ListType.Numbered;
  9.                     //_textControl.Selection.ListFormat.NumberFormat = NumberFormat.ArabicNumbers;
  10.                 }
复制代码
回复 使用道具 举报
mindrayguowei
中级会员   /  发表于:2016-9-8 10:00:03
5#
撤销的问题解决了, 谢谢
还是这个demo, 还有另外一个问题, 我在一个table框里面输入了一些内容之后, 想要全部复制这个框里面的内容, 全选这些内容的时候很容易把外面的表格框也选中, 这样在 Ctrl C Ctrl V的时候很容易把整个表格也复制粘贴, 实际上用户只想要复制框里面的内容, 而不想要复制表格, 有什么好的解决办法吗?
回复 使用道具 举报
gw0506
超级版主   /  发表于:2016-9-8 11:21:34
6#
我没太理解你描述的场景。
我用咱们之前这个Demo,在第一个table中输入了一些内容,然后鼠标从后向前托转,全选内容。然后复制。然后粘贴到下面的Table中,感觉正常吧。
blob853832397.png
回复 使用道具 举报
mindrayguowei
中级会员   /  发表于:2016-9-8 11:28:31
7#
鼠标拖拽的时候很容易把整个框选中, 一旦这个框业选中了, 再复制粘贴, 就多复制一个框出来了
回复 使用道具 举报
gw0506
超级版主   /  发表于:2016-9-8 11:48:02
8#
mindrayguowei 发表于 2016-9-8 11:28
鼠标拖拽的时候很容易把整个框选中, 一旦这个框业选中了, 再复制粘贴, 就多复制一个框出来了

这没办法了。
从前往后选,容易全选。
从最后往前选,不会选中Table。你试试。
回复 使用道具 举报
mindrayguowei
中级会员   /  发表于:2016-9-11 18:44:14
9#
关于选中整个框的问题, 我有另外一个思路.
是否可以在复制的时候不复制整个框, 或者粘贴的时候不粘贴整个框
我看有TextControl有Copy方法和Paste方法.
Past方法有参数控制, 能否在按下Ctrl V的时候调用这个Paste方法来防止复制外面的框?
回复 使用道具 举报
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下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部