在 Word 加载项中设置 ReadingLayout 在 Word 2013 中的工作方式与在 Word 2016 中不同
Setting ReadingLayout in Word Add-In works differently in Word 2013 than in Word 2016
以下代码让我的 Word 2016 加载项非常痛苦:
_application.ActiveWindow.View.ReadingLayout = true;
问题是 Word 2013 和 Word 2016 似乎对上述代码行执行不同的操作。
Word 2013 只会将该设置应用于活动 window。因此,当我打开另一个文档时,它将以编辑模式打开,而不是阅读布局。这就是我想要的行为。
在 Word 2016 中,完全相同的代码行似乎不仅为活动 window 设置 ReadingLayout,而且为设置该设置后打开的所有其他 window(不适用于其他开放 windows)。具体来说,我将打开一个文档,将 ReadingLayout 设置为 true,以便活动 window 更改为阅读布局,然后我将打开另一个文档。它不是以编辑模式打开,而是以阅读布局打开。
即使我关闭并重新打开 Word,所有通过 Word 打开的文档都将以阅读布局打开,直到我手动去更改布局。
我的问题是:有没有办法获得 Word 2013 中存在的行为?如果那不可能,那么有没有一种方法可以在阅读布局中打开文档,而不会弄乱用户对他们将要打开的未来文档的视图设置?
一些背景知识:我正在使用的 Word 加载项用于创建文档模板,这些模板可用于从数据库中的数据生成文档。该加载项能够显示从当前模板生成的文档的预览。此预览应在阅读布局中打开,因为它不打算对其进行更改。
作为参考,这是包含问题代码行的整个函数:
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;
}
}
以防万一你想知道,我已经尝试了一些其他的 Open 方法(除了 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 2016 加载项非常痛苦:
_application.ActiveWindow.View.ReadingLayout = true;
问题是 Word 2013 和 Word 2016 似乎对上述代码行执行不同的操作。
Word 2013 只会将该设置应用于活动 window。因此,当我打开另一个文档时,它将以编辑模式打开,而不是阅读布局。这就是我想要的行为。
在 Word 2016 中,完全相同的代码行似乎不仅为活动 window 设置 ReadingLayout,而且为设置该设置后打开的所有其他 window(不适用于其他开放 windows)。具体来说,我将打开一个文档,将 ReadingLayout 设置为 true,以便活动 window 更改为阅读布局,然后我将打开另一个文档。它不是以编辑模式打开,而是以阅读布局打开。
即使我关闭并重新打开 Word,所有通过 Word 打开的文档都将以阅读布局打开,直到我手动去更改布局。
我的问题是:有没有办法获得 Word 2013 中存在的行为?如果那不可能,那么有没有一种方法可以在阅读布局中打开文档,而不会弄乱用户对他们将要打开的未来文档的视图设置?
一些背景知识:我正在使用的 Word 加载项用于创建文档模板,这些模板可用于从数据库中的数据生成文档。该加载项能够显示从当前模板生成的文档的预览。此预览应在阅读布局中打开,因为它不打算对其进行更改。
作为参考,这是包含问题代码行的整个函数:
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;
}
}
以防万一你想知道,我已经尝试了一些其他的 Open 方法(除了 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;
}
};
如果有的话,希望有人能提供更优雅的解决方案。