C# 在Word加载项中设置ReadingLayout在Word 2013中的效果与在Word 2016中的效果不同

C# 在Word加载项中设置ReadingLayout在Word 2013中的效果与在Word 2016中的效果不同,c#,ms-word,vsto,office-addins,C#,Ms Word,Vsto,Office Addins,以下代码在Word 2016的外接程序中给我带来了很多痛苦: _application.ActiveWindow.View.ReadingLayout = true; 问题是Word2013和Word2016似乎对上述代码行做了不同的事情 Word 2013将仅将该设置应用于活动窗口。因此,当我打开一个不同的文档时,它将以编辑模式打开,而不是阅读布局。这就是我想要的行为 在Word 2016中,完全相同的代码行不仅用于设置活动窗口的ReadingLayout,而且用于设置该设置后打开的每个其他

以下代码在Word 2016的外接程序中给我带来了很多痛苦:

_application.ActiveWindow.View.ReadingLayout = true;
问题是Word2013和Word2016似乎对上述代码行做了不同的事情

Word 2013将仅将该设置应用于活动窗口。因此,当我打开一个不同的文档时,它将以编辑模式打开,而不是阅读布局。这就是我想要的行为

在Word 2016中,完全相同的代码行不仅用于设置活动窗口的ReadingLayout,而且用于设置该设置后打开的每个其他窗口(不用于其他打开的窗口)。具体来说,我将打开一个文档,将ReadingLayout设置为true,以便活动窗口更改为reading layout,然后我将打开另一个文档。它不是在编辑模式下打开,而是在阅读版面中打开

即使我关闭并重新打开Word,通过Word打开的所有文档都将在阅读版面中打开,直到我手动更改版面

我的问题是:有没有办法获得Word 2013中存在的行为?如果这是不可能的,那么有没有一种方法可以在阅读版面中打开文档,而不会弄乱用户将来要打开的文档的视图设置

一点背景知识:我正在使用的单词Add-In用于创建文档模板,可用于从数据库中的数据生成文档。外接程序能够显示从当前模板生成的文档的预览。此预览应在阅读版面中打开,因为它不打算对其进行更改

作为参考,这是包含问题代码行的整个函数:

public void OpenDocumentPreview(string path, bool showFeedback)
{
    _application.Documents.OpenNoRepairDialog(path, ReadOnly: true, AddToRecentFiles: false, Visible: true);
    _application.ActiveWindow.View.ReadingLayout = true;
    if (showFeedback)
    {
        _application.ActiveWindow.View.RevisionsFilter.Markup = WdRevisionsMarkup.wdRevisionsMarkupAll;
        _application.ActiveWindow.View.MarkupMode = WdRevisionsMode.wdBalloonRevisions;
        _application.ActiveWindow.View.ShowComments = true;
    }
}

以防万一,我尝试了其他一些开放方法(除了
OpenNoRepairDialog
)。它们都会导致相同的行为。

这可能不是最理想的解决方案,但它帮助我解决了一个与您类似的问题。它涉及到定制文件扩展名并使用文档事件检查它们

  • 如果在关闭预览文件之前允许打开其他文件,则需要在
    DocumentOpen
    事件中设置
    ReadingLayout=false
    ,以便在Word的默认编辑模式下打开这些文件

  • 如果预览文件可能在另一个文件打开之前关闭,则需要在
    DocumentBeforeClose
    事件上执行相同的操作

这假定您希望在打印视图模式下打开所有模板文件进行编辑

设置
Globals.YourAddin.Application.ActiveWindow.View.Type=WdViewType.wdPrintView
可能不是必需的,但如果没有它,我的文档将在看起来像Web布局视图的视图中打开

Globals.YourAddin.Application.DocumentOpen += doc =>
        {
            if (doc.Name.EndsWith(".customTemplateExtension"))
            {
                Globals.YourAddin.Application.ActiveWindow.View.ReadingLayout = false;
                Globals.YourAddin.Application.ActiveWindow.View.Type = WdViewType.wdPrintView;
            }
        };

Globals.YourAddin.Application.DocumentBeforeClose += (Document doc, ref bool cancel) =>
        {
            if (doc.Name.EndsWith(".customPreviewExtension"))
            {
                    Globals.YourAddin.Application.ActiveWindow.View.ReadingLayout = false;
            }
        };

如果有的话,希望有人能提供一个更优雅的解决方案。

虽然这不是一个理想的解决方案,但我已经接受了一个事实,即Word 2013和Word 2016的加载项工作方式不同,我可能需要通过实现类似于您的答案来解决这个问题。谢谢