在RichTextBox中使用受保护文本撤消/重做

时间:2017-05-01 17:45:48

标签: c# richtextbox rtf undo-redo

我们使用RichTextBox来显示文本。我们遇到了使用受保护文本撤消/重做的问题。

这是工作流程,通常我们有纯文本,在这种情况下,undo / redo工作正常。偶尔我们需要将某些文本标记为“受保护”。我们进行验证并动态转换Rtf并执行以下操作将其分配回RTB:

m_rtbText.Rtf = sRtf

问题是在这一行之后,

m_rtbText.CanUndo

属性将在内部设置为False,因此我们丢失了所有撤消步骤。举个例子,这是验证前的样子:

\cf1\i0\v\f2 <PSI_START_OBJECT><PSI_MEDIA><Media2><MediaID>16346</MediaID><Name>\f3\rtlch\'e4\'d4\'d1\'c9 \'cc\'e6\'ed\'c9</\f2\ltrch Name><FileName>N:\\media\f3\rtlch\\\'e4\'d4\'d1\'c9 \'cc\'e6\'ed\'c9_1.\f2\ltrch wav</FileName><Length>00:00:33.0</Length><OutCue></OutCue><Description></Description></Media2><PSI_MID_OBJECT\f3\rtlch >\v0\f0\'c7\'e1\'ca\'de\'d1\'ed\'d1 \'c7\'e1\'c5\'ce\'c8\'c7\'d1\'ed : \cf2\'e4\'d4\'d1\'c9 \'cc\'e6\'ed\'c9\par
 \cf1\'c7\'e1\'e3\'cf\'f8\'c9 : \cf2\f3 00:00:33.0\cf3\i\f4 .\v <\f1\ltrch PSI_END_OBJECT\f4\rtlch >\cf0\v0\f1\ltrch\par

以下是验证后的样子:

\cf1\i0\protect\v\f2 <PSI_START_OBJECT><PSI_MEDIA><Media2><MediaID>16346</MediaID><Name>\f3\rtlch\'e4\'d4\'d1\'c9 \'cc\'e6\'ed\'c9</\f2\ltrch Name><FileName>N:\\media\f3\rtlch\\\'e4\'d4\'d1\'c9 \'cc\'e6\'ed\'c9_1.\f2\ltrch wav</FileName><Length>00:00:33.0</Length><OutCue></OutCue><Description></Description></Media2><PSI_MID_OBJECT\f3\rtlch >\v0\f0\'c7\'e1\'ca\'de\'d1\'ed\'d1 \'c7\'e1\'c5\'ce\'c8\'c7\'d1\'ed : \cf2\'e4\'d4\'d1\'c9 \'cc\'e6\'ed\'c9\par
 \cf1\'c7\'e1\'e3\'cf\'f8\'c9 : \cf2\f3 00:00:33.0\cf3\i\f4 .\v <\f1\ltrch PSI_END_OBJECT\f4\rtlch >\cf0\protect0\v0\f1\ltrch\par

如您所见,这里唯一的区别是2个“保护”条目。文本方面它们完全相同。

这可能是微软的错误还是我错过了什么?仅供参考我们使用的是.NET framework 4.6.2,VS2015 Update3

1 个答案:

答案 0 :(得分:2)

感谢dlatikay, 似乎我们无法直接使用Rtf赋值,这样做会导致undo堆栈丢失。另一种方法是使用Selected Rtf。以下代码有效:

m_rtbText.SelectionStart = 0;
m_rtbText.SelectAll();
m_rtbText.SelectedRtf = sRtf;

这基本上是一个替代品。撤消撤消。