最近在Word上做开发,使用的Open XML SDK 2.0和VSTO。生成Word文件时使用了XML映射来实现内容控件(ContentControl)和自定义XML部件(CustomXMLPart)中的xml进行绑定,编辑文档时使用VSTO进行动态操作Word。
由于在编辑Word文档时,会动态添加内容控件(ContentControl),同时修改xml,进行xml映射。这就会遇到一个问题是:Word文档的撤消(undo)和重复(redo)操作,只影响内容控件(ContentControl)而不影响自定义XML部件(CustomXMLPart)中的xml,想到解决办法是禁用Word文档撤消(undo)和重复(redo)操作。在网上google之后,Word文档中不能禁用撤消(undo)和重复(redo)功能,也不允许修改撤消(undo)和重复(redo)的堆栈最大数值。但是允许清除撤消(undo)和重复(redo)的堆栈。
清除当前文档的撤消(undo)堆栈
Sub ClearActiveDocumentUndoStack()
ActiveDocument.UndoClear
End Sub
ActiveDocument.UndoClear
End Sub
清除所有打开文档的撤消(undo)堆栈
Sub ClearAllDocumentsUndoStack()
Dim oDocUndoStack as Object
For Each oDocUndoStack In Application.Documents
oDocUndoStack.UndoClear
Next oDocUndoStack
End Sub
Dim oDocUndoStack as Object
For Each oDocUndoStack In Application.Documents
oDocUndoStack.UndoClear
Next oDocUndoStack
End Sub
C#中Document也存在对应的UndoClear方法,撤消(undo)堆栈确实清空了,按照文章中的说法重复(redo)也应该不可能了,但实际在Word2010还是可以用的。只好用个小技巧(trick),调用UndoClear后,随便select点什么就行了。重复(redo)操作也只是select什么,没有不良后果。
参考文档 :WD2000: How to Clear the Undo Stack