Word互操作加载项 - 更改窗口视图属性不会影响版本标记样式

时间:2015-11-25 20:32:27

标签: c# ms-word vsto office-interop word-2013

使用应用程序级加载项,我在文档打开时执行一些操作,要求修订(跟踪的更改)以内联而非隐藏,以便它们包含在{ {1}}文件。在查阅文档之后,我认为我所要做的就是更改活动窗口的the view propertiesRange声称要做我想做的事。

但是这个属性似乎与修订版在文档中的显示方式完全脱节!为了测试这一点,我尝试在文档中手动切换模式,然后查看MarkupMode,然后在MarkupMode事件处理程序中立即检查它。我继续追踪onSelectionChange的一系列属性,这是很好的衡量标准。让我感到惊讶和懊恼的是,当我看到内联的变化呈现内联时:

before

before values

...并将值与隐藏更改的值进行比较:

after

after values

没有改变!是什么赋予了?我没有查看正确的属性/属性以确保更改是内联呈现的吗?微软是否完全无法编写有意义的文档?我会指出我也尝试在代码中进行属性更改,以查看修订版本的呈现是否会发生变化,但没有成功。我将不胜感激任何反馈。

修改:复制问题的简单代码:

ActiveWindow.View

编辑2:除了这个人为设想的示例之外,我还需要控制修订版的标记样式,因为我在private void ThisAddIn_Startup(object sender, EventArgs e) { Application.WindowSelectionChange += application_WindowSelectionChange; } private void application_WindowSelectionChange(Selection sel) { var testDoc = sel.Document; var test = new { testDoc.ActiveWindow.View, testDoc.ActiveWindow.View.ShowRevisionsAndComments, testDoc.ActiveWindow.View.ShowInsertionsAndDeletions, testDoc.ActiveWindow.View.MarkupMode, testDoc.ActiveWindow.View.RevisionsMode }; } 上搜索可能包含DocumentOpen文本的文字{1}}个对象。更具体地说,我试图使用上面的文本(在修订版中以文本“强大的方式帮助你证明”删除)来执行以下操作:

Revision

编辑3:正如Cindy所说,我的问题是我使用了错误的属性:我需要使用private void ThisAddIn_Startup(object sender, EventArgs e) { Application.DocumentOpen += application_DocumentOpen; } private void application_DocumentOpen(Document doc) { // expected text, as taken from screengrab example above. Includes // text removed in a revision string expectedText = "Video provides a powerful way to help you prove your point."; // make sure that we're in print view if (doc.ActiveWindow.View.Type != WdViewType.wdPrintView) { doc.ActiveWindow.View.Type = WdViewType.wdPrintView; } // attempt to ensure that document revisions are marked up inline. Does not accomplish anything doc.ActiveWindow.View.MarkupMode = WdRevisionsMode.wdInLineRevisions; // attempt to locate text. Will fail if revisions are not marked up inline (deletion is not part of document content range otherwise) var locatedRange = doc.Content.OccurrenceOfText(expectedText); } // extension method to locate text inside a range. Searching entire Content in this example private static Range OccurrenceOfText(this Range rng, string text) { rng.Find.Forward = true; rng.Find.Format = false; rng.Find.Execute(text); if (!rng.Find.Found) { throw new Exception("Unable to locate text! Are Revisions marked up inline?"); } // return brand new range containing located content return rng.Document.Range(rng.Start, rng.End); } 属性进行更改。另外,我没有诊断出的一个问题是,根据View属性,完全有可能从我执行的搜索返回的View.RevisionsFilter.Markup返回的Range属性不同于搜索过的文本。如果Text中存在Revision个对象,则会发生这种情况。

1 个答案:

答案 0 :(得分:1)

它对我有用。我做了什么:

  1. 创建了一个测试文档。 Used = rand() - >按Enter键将一些文本放入文档中。复制短语,改变强大的" to"有用"。
  2. 启用了跟踪更改并进行了一些更改,包括选择"有用"并打字"强大的"。
  3. 确保更改显示在气球和" Original"正在展示加价的观点。
  4. 保存并关闭了文档。
  5. 在调用OccurrenceOfText的行上放置一个断点,然后在调试模式下用F5启动加载项。
  6. 打开已保存的文档。解雇了Open事件。我检查了View.Markup和View.RevisionsView的值 - 它们已经改为内联和#34; Final"。逐步完成剩下的代码并正确执行(找到事件)。
  7. 我需要稍微修改您的代码,因为我没有#34;包装"。我也改变了OccurrenceOfText返回Range的方式:不需要以你使用的复杂方式来做...

    我注意到你似乎没有设置View.RevisionsView - 也许这就是为什么你没有看到你期望的结果?

    JdbcTemplate