支持多个文档视图

可以通过为编辑器创建单独文档数据和文档视图对象提供文档的多个视图。 在某些情况下,有用的其他文档视图包括:

  • 新窗口支持:希望编辑器提供两个或多个相同类型的视图,以便已在编辑器中打开窗口的用户可以通过从“窗口”菜单中选择“新建窗口”命令来打开一个新窗口。

  • 窗体和代码视图支持:希望编辑器提供不同类型的视图。 例如,Visual Basic 同时提供窗体视图和代码视图。

    有关此情况的详细信息,请参阅 Visual Studio 包模板创建的自定义编辑器项目中的 EditorFactory.cs 文件中的 CreateEditorInstance 程序。 有关此项目的详细信息,请参阅演练:创建自定义编辑器

同步视图

实现多个视图时,文档数据对象将负责保持所有视图与数据同步。 可以使用 VsTextBuffer 上的事件处理接口将多个视图与数据同步。

如果不使用 VsTextBuffer 对象同步多个视图,则必须实现自己的事件系统来处理对文档数据对象所做的更改。 可以使用不同的粒度级别来将多个视图保持最新。 通过最大粒度设置,当你在一个视图中键入时,其他视图也会立即更新。 使用最小粒度时,其他视图在激活之前不会更新。

确定文档数据是否已打开

集成开发环境 (IDE) 中正在运行的文档表 (RDT) 有助于跟踪文档的数据是否已打开,如下图所示。

DocDataView 图形

多个视图

默认情况下,每个视图(文档视图对象)都包含在其自己的窗口框架 (IVsWindowFrame) 中。 但是,正如前面提到的,文档数据可以在多个视图中显示。 若要启用此功能,Visual Studio 将检查 RDT 以确定所讨论的文档是否已在编辑器中打开。 当 IDE 调用 CreateEditorInstance 创建编辑器时,punkDocDataExisting 参数中返回的非 NULL 值指示文档已在另一个编辑器中打开。 有关 RDT 运行方式的详细信息,请参阅“运行文档表”

IVsEditorFactory 实现中,检查 punkDocDataExisting 中返回的文档数据对象,以确定文档数据是否适合编辑器。 (例如,HTML 编辑器应仅显示 HTML 数据。)如果合适,则编辑器工厂应为数据提供第二个视图。 如果 punkDocDataExisting 参数不是 NULL,则文档数据对象可能已在另一个编辑器中打开,或者更可能的是,文档数据已在具有同一编辑器的不同视图中打开。 如果文档数据在编辑器工厂不支持的其他编辑器中打开,则 Visual Studio 无法打开编辑器工厂。 有关详细信息,请参阅操作说明:将视图附加到文档数据