可以通过为编辑器创建单独的文档数据和文档视图对象来提供文档的多个视图。 在某些情况下,其他文档视图非常有用:
新窗口支持:希望编辑器提供两个或多个相同类型的视图,以便已在编辑器中打开窗口的用户可以通过从“窗口”菜单中选择“新建窗口”命令来打开一个新窗口。
表单和代码视图支持:希望编辑器提供不同类型的视图。 例如,Visual Basic 提供窗体视图和代码视图。
有关详细信息,请参阅 Visual Studio 包模板创建的自定义编辑器项目中EditorFactory.cs文件中的 CreateEditorInstance 过程。 有关此项目的详细信息,请参阅 演练:创建自定义编辑器。
视图同步
实现多个视图时,文档数据对象负责将所有视图与数据保持同步。 可以使用事件 VsTextBuffer 处理接口将多个视图与数据同步。
如果不使用该 VsTextBuffer 对象同步多个视图,则必须实现自己的事件系统来处理对文档数据对象所做的更改。 可以使用不同的粒度级别使多个视图保持最新状态。 在设置为最小粒度时,当您在一个视图中输入时,其他视图会实时更新。 在最小粒度下,其他视图在激活之前不会更新。
确定文档数据是否已打开
集成开发环境(IDE)中正在运行的文档表(RDT)有助于跟踪文档的数据是否已打开,如下图所示。
多个视图
默认情况下,每个视图(文档视图对象)都包含在其自己的窗口框架(IVsWindowFrame)。 但是,如前所述,文档数据可以显示在多个视图中。 若要启用此功能,Visual Studio 会检查 RDT,以确定有问题的文档是否已在编辑器中打开。 当 IDE 调用 CreateEditorInstance 创建编辑器时,参数中 punkDocDataExisting 返回的非 NULL 值指示文档已在另一个编辑器中打开。 有关 RDT 函数方式的详细信息,请参阅 “运行文档表”。
在你的IVsEditorFactory实施中,检查在punkDocDataExisting返回的文档数据对象,以确定该文档数据是否适合你的编辑器。 (例如,HTML 编辑器应仅显示 HTML 数据。如果合适,则编辑器工厂应为数据提供第二个视图。
punkDocDataExisting如果参数不是NULL,则可能是文档数据对象在另一个编辑器中已打开,或者更大可能是文档数据已经在同一个编辑器的不同视图中打开。 如果文档数据在编辑器工厂不支持的其他编辑器中打开,则 Visual Studio 无法打开编辑器工厂。 有关详细信息,请参阅 “如何:将视图附加到文档数据”。