如何循环访问 VSTO 加载项中的打开窗体?

How to iterate through open forms in a VSTO add-in?

我有一个用于 MS Project 的 VSTO 加载项,它可以打开表单,其中数据与打开表单时处于活动状态的特定项目文件相关。可以打开与一个项目文件相关的一种表格,同时打开与第二个打开的项目文件相关的另一种不同表格。

当我关闭项目文件时,我想检查每个打开的表单,如果表单基础项目 ID 等于正在关闭的项目文件的项目 ID,则将其关闭。如何访问 vsto 应用程序的开放表单集合(或做一些等效的事情)? Application.OpenForms 对象似乎不存在于 vsto 世界中。

使用 Dictionary 对象存储表单实例以及文件名。每次创建表单时,将其添加到字典中,当项目关闭时,搜索字典以关闭相应的副本。

Friend ProjectForms As New Dictionary(Of String, MyForm)

Friend Sub ShowForm()
    Dim f As New MyForm
    Try
        ProjectForms.Add(ProjApp.ActiveProject.Name, f)
    Catch AlreadyInTheDictionary As Exception
        ' do nothing, it's already in the dictionary
    End Try
    f.Show()
End Sub

将其与应用程序事件(通常是 ThisAddIn)一起放入模块中。

Private Sub Application_ProjectBeforeClose(pj As MSProject.Project, ByRef Cancel As Boolean) Handles Application.ProjectBeforeClose
    ProjectForms(pj.Name).Close()
End Sub