Word 互操作加载项 - 更改 Window 视图属性不影响修订标记样式
Word interop add-in - changing Window View properties do not affect Revision markup style
使用应用程序级加载项,我正在对打开的文档执行一些操作,这些操作需要内联呈现而不是隐藏修订(跟踪的更改),以便它们包含在文档的 Range
中。查阅文档后,我认为我所要做的就是更改活动 window 的 the view properties: MarkupMode
声称做我想做的。
但是这个属性似乎与文档中修订的显示方式完全脱节!为了对此进行测试,我尝试在文档中手动切换模式,然后查看 MarkupMode
,然后立即在 onSelectionChange
事件处理程序中对其进行检查。为了更好地衡量,我继续跟踪了 ActiveWindow.View
的一系列属性。令我惊讶和懊恼的是,当我查看带有内联渲染更改的本地人时:
...并将值与隐藏更改的值进行比较:
没有任何变化!是什么赋予了?我不是在查看正确的 property/properties 以确保内联呈现更改吗?微软完全没有能力编写有意义的文档吗?我要指出的是,我也尝试在代码中进行 属性 更改,以查看修订的呈现是否会更改,但没有成功。如果有任何反馈,我将不胜感激。
编辑: 复制问题的简单代码:
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
};
}
编辑 2: 除了这个人为设计的示例之外,我还需要控制 Revisions 的标记样式,因为我正在 DocumentOpen
上搜索可能包含文本的文本作为 Revision
个对象存在。更具体地说,我正在尝试使用上面的文本(修订版中删除了文本 "powerful way to help you prove ")来执行以下操作:
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);
}
编辑 3: 正如 Cindy 所说,我的问题是我使用了错误的 属性:我需要使用 View.RevisionsFilter.Markup
属性 进行更改。此外,我没有诊断出的一个问题是,根据视图属性,Range
完全有可能像我一样从搜索中返回 returns a Text
属性 与搜索的文本不同。如果 Revision
对象存在于 Range
.
中,就会发生这种情况
对我有用。我做了什么:
- 创建了一个测试文档。使用 =rand() ->Press Enter 在文档中放置一些文本。复制在短语中,将 "powerful" 更改为 "useful".
- 打开曲目更改并进行了一些更改,包括选择 "useful" 并键入 "powerful"。
- 确保更改显示在气球中,并且显示标记的 "Original" 视图。
- 保存并关闭文档。
- 在调用 OccurrenceOfText 的行上放置一个断点,然后按 F5 以调试模式启动加载项。
- 打开了保存的文档。 Open 事件被触发。我检查了 View.Markup 和 View.RevisionsView 的值 - 它们已更改为内联和 "Final"。单步执行其余代码并正确执行(找到事件)。
我需要稍微修改一下你的代码,因为我没有你的 "wrapper"。我还更改了 OccurrenceOfText returns Range 的方式:无需以您使用的复杂方式进行...
我注意到您似乎没有设置 View.RevisionsView - 也许这就是您没有看到预期结果的原因?
private void Application_DocumentOpen(Microsoft.Office.Interop.Word.Document doc)
{
//Test revisions
// 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 != Word.WdViewType.wdPrintView)
{
doc.ActiveWindow.View.Type = Word.WdViewType.wdPrintView;
}
// attempt to ensure that document revisions are marked up inline. Does not accomplish anything
Word.View vw = doc.ActiveWindow.View;
vw.MarkupMode = Word.WdRevisionsMode.wdInLineRevisions;
vw.RevisionsView = Word.WdRevisionsView.wdRevisionsViewFinal;
// attempt to locate text. Will fail if revisions are not marked up inline (deletion is not part of document content range otherwise)
var locatedRange = OccurrenceOfText(doc.Content, expectedText);
}
// extension method to locate text inside a range. Searching entire Content in this example
private static Word.Range OccurrenceOfText(Word.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);
}
使用应用程序级加载项,我正在对打开的文档执行一些操作,这些操作需要内联呈现而不是隐藏修订(跟踪的更改),以便它们包含在文档的 Range
中。查阅文档后,我认为我所要做的就是更改活动 window 的 the view properties: MarkupMode
声称做我想做的。
但是这个属性似乎与文档中修订的显示方式完全脱节!为了对此进行测试,我尝试在文档中手动切换模式,然后查看 MarkupMode
,然后立即在 onSelectionChange
事件处理程序中对其进行检查。为了更好地衡量,我继续跟踪了 ActiveWindow.View
的一系列属性。令我惊讶和懊恼的是,当我查看带有内联渲染更改的本地人时:
...并将值与隐藏更改的值进行比较:
没有任何变化!是什么赋予了?我不是在查看正确的 property/properties 以确保内联呈现更改吗?微软完全没有能力编写有意义的文档吗?我要指出的是,我也尝试在代码中进行 属性 更改,以查看修订的呈现是否会更改,但没有成功。如果有任何反馈,我将不胜感激。
编辑: 复制问题的简单代码:
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
};
}
编辑 2: 除了这个人为设计的示例之外,我还需要控制 Revisions 的标记样式,因为我正在 DocumentOpen
上搜索可能包含文本的文本作为 Revision
个对象存在。更具体地说,我正在尝试使用上面的文本(修订版中删除了文本 "powerful way to help you prove ")来执行以下操作:
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);
}
编辑 3: 正如 Cindy 所说,我的问题是我使用了错误的 属性:我需要使用 View.RevisionsFilter.Markup
属性 进行更改。此外,我没有诊断出的一个问题是,根据视图属性,Range
完全有可能像我一样从搜索中返回 returns a Text
属性 与搜索的文本不同。如果 Revision
对象存在于 Range
.
对我有用。我做了什么:
- 创建了一个测试文档。使用 =rand() ->Press Enter 在文档中放置一些文本。复制在短语中,将 "powerful" 更改为 "useful".
- 打开曲目更改并进行了一些更改,包括选择 "useful" 并键入 "powerful"。
- 确保更改显示在气球中,并且显示标记的 "Original" 视图。
- 保存并关闭文档。
- 在调用 OccurrenceOfText 的行上放置一个断点,然后按 F5 以调试模式启动加载项。
- 打开了保存的文档。 Open 事件被触发。我检查了 View.Markup 和 View.RevisionsView 的值 - 它们已更改为内联和 "Final"。单步执行其余代码并正确执行(找到事件)。
我需要稍微修改一下你的代码,因为我没有你的 "wrapper"。我还更改了 OccurrenceOfText returns Range 的方式:无需以您使用的复杂方式进行...
我注意到您似乎没有设置 View.RevisionsView - 也许这就是您没有看到预期结果的原因?
private void Application_DocumentOpen(Microsoft.Office.Interop.Word.Document doc)
{
//Test revisions
// 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 != Word.WdViewType.wdPrintView)
{
doc.ActiveWindow.View.Type = Word.WdViewType.wdPrintView;
}
// attempt to ensure that document revisions are marked up inline. Does not accomplish anything
Word.View vw = doc.ActiveWindow.View;
vw.MarkupMode = Word.WdRevisionsMode.wdInLineRevisions;
vw.RevisionsView = Word.WdRevisionsView.wdRevisionsViewFinal;
// attempt to locate text. Will fail if revisions are not marked up inline (deletion is not part of document content range otherwise)
var locatedRange = OccurrenceOfText(doc.Content, expectedText);
}
// extension method to locate text inside a range. Searching entire Content in this example
private static Word.Range OccurrenceOfText(Word.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);
}