Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Word互操作加载项-更改窗口视图属性不会影响修订标记样式_C#_Ms Word_Vsto_Office Interop_Word 2013 - Fatal编程技术网

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

C# Word互操作加载项-更改窗口视图属性不会影响修订标记样式,c#,ms-word,vsto,office-interop,word-2013,C#,Ms Word,Vsto,Office Interop,Word 2013,使用应用程序级外接程序,我正在对打开的文档执行一些操作,这些操作要求内联呈现修订(跟踪的更改),而不是隐藏,以便它们包含在文档的范围内。在查阅文档之后,我认为我所要做的就是更改活动窗口的名称:MarkupMode声明要做我想做的事情 但此属性似乎与文档中的修订显示方式完全断开连接!为了测试这一点,我尝试在文档中手动切换模式,查看MarkupMode,然后立即在onSelectionChange事件处理程序中检查它。我继续跟踪了ActiveWindow.View的一系列属性。令我惊讶和懊恼的是,当

使用应用程序级外接程序,我正在对打开的文档执行一些操作,这些操作要求内联呈现修订(跟踪的更改),而不是隐藏,以便它们包含在文档的
范围内。在查阅文档之后,我认为我所要做的就是更改活动窗口的名称:
MarkupMode
声明要做我想做的事情

但此属性似乎与文档中的修订显示方式完全断开连接!为了测试这一点,我尝试在文档中手动切换模式,查看
MarkupMode
,然后立即在
onSelectionChange
事件处理程序中检查它。我继续跟踪了
ActiveWindow.View
的一系列属性。令我惊讶和懊恼的是,当我看到当地人的变化时:

。。。并将这些值与隐藏更改的值进行比较:

什么都没变!有什么好处?我是否在查看正确的属性以确保更改以内联方式呈现?Microsoft是否完全无法编写有意义的文档?我将指出,我也尝试在代码中更改属性,以查看修订的呈现是否会更改,但没有成功。如果有任何反馈,我将不胜感激

编辑:复制问题的简单代码:

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:除了这个精心设计的示例之外,我还需要控制修订的标记样式,因为我正在
DocumentOpen
上搜索可能包含作为
Revision
对象显示的文本。更具体地说,我正试图使用上述文本(在修订版中删除文本“帮助您证明的强大方式”):


编辑3:正如Cindy所说,我的问题是使用了错误的属性:我需要使用
View.RevisionsFilter.Markup
属性进行更改。此外,我没有诊断出的一个问题是,根据视图属性的不同,完全有可能从执行的搜索中返回的
范围
返回的
文本
属性与搜索时使用的文本不同。如果
Revision
对象出现在
范围内,则可能会发生这种情况,该范围对我有效。我所做的:

  • 创建了一个测试文档。Used=rand()->按Enter键在文档中放入一些文本。在短语中复制,将“强大”改为“有用”
  • 打开轨迹更改并进行了一些更改,包括选择“有用”和键入“强大”
  • 确保更改显示在引出序号中,并显示标记的“原始”视图
  • 保存并关闭文档
  • 在调用OccurrenceOfText的行上放置一个断点,然后用F5在调试模式下启动外接程序
  • 打开保存的文档。打开的事件被触发。我检查了View.Markup和View.RevisionsView的值-它们已更改为内联和“Final”。逐步完成代码的其余部分并正确执行(找到了发生的情况)
  • 我需要稍微修改一下你的代码,因为我没有你的“包装器”。我还改变了OccurrenceOfText返回范围的方式:无需以复杂的方式使用

    我注意到您似乎没有设置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);
     }
    

    我不熟悉您使用的语法:var test=new{…}。测试进程内(VBA)更改您列出的属性确实有效,因此它可能与您构建代码的方式有关。您提到这应该在DocumentOpen上运行—调用代码时,文档可能还没有准备好接收这些命令。你能为真正的问题提供准确的重做步骤吗?@Cindymister谢谢你的回答,Cindy。您是对的,这不是我试图在代码中与
    MarkupMode
    属性交互的方式,但即使是这个精心设计的示例也演示了我的问题,并且很容易重现。没有必要使用我提供的匿名对象构造;它只显示我正在查看的属性,以及调试时的值。您只需简单地检查
    Document.ActiveWindow.View
    @Cindyme的属性即可。请输入一个快速描述:在打开/关闭内联修订标记后,如我提供的屏幕抓图所示,然后检查
    Document.ActiveWindow.View
    的属性,无论您是像我一样通过触发
    SelectionChange
    事件还是其他机制来执行此操作,您都可以验证我列出的属性(
    ShowRevisionsAndComments
    ShowInsertionsAndDeletions
    MarkupMode
    RevisionMode
    )没有任何更改。这让我相信,也许我没有看到正确的财产。我仍然对你打算如何实际使用这些财产的复制步骤感兴趣。Word有可能返回“假”信息,因为在您要用于监视此触发器的事件发生时,实际情况尚未生效。重要的是,是否可以在您需要的时候在VSTO中实际设置属性…@Cindymister fair。我在文章中的一个编辑中提供了我的用法。啊,我没有考虑使用<代码>修订版视图>代码>属性。这并不能完全解决我的问题。您正在查找最终的标记,但我正在尝试对包含原始文本和新文本的字符串进行文本搜索,与在文档内联中呈现修订时的显示完全相同。然后我要寻找的字符串是:“视频提供了一种强大的有用方式来帮助你证明你的观点。”在文档的上下文中,“强大”加下划线,然后
     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);
     }