"share" 同一演示文稿的所有 windows 之间的自定义任务窗格
"share" a custom task pane between all windows of the same presentation
我使用以下代码跨演示文稿管理 PowerPoint VSTO 中的不同自定义任务窗格。这很好用,例如当用户打开一个新的演示文稿时,会创建一个新的任务窗格,它不会影响任何其他打开的演示文稿任务窗格。
现在我遇到了以下情况。用户打开了一个演示文稿,现在在 PowerPoint 中为此演示文稿打开了一个额外的 window(单击“查看”、“新建 window”)。现在发生的是创建了一个新的自定义任务窗格(因为此 window 的 HWND 不同),但我需要此任务窗格与其他演示文稿中的相同 window.
问题:如何在同一演示文稿的所有 windows 之间“共享”任务窗格?
Dim CreatedPanes As New Dictionary(Of String, CustomTaskPane)
Public Function GetTaskPane(taskPaneId As String, taskPaneTitle As String) As Microsoft.Office.Tools.CustomTaskPane
Dim key As String = $"{taskPaneId}({Globals.ThisAddIn.Application.HWND})"
If Not CreatedPanes.ContainsKey(key) Then
Dim pane = Globals.ThisAddIn.CustomTaskPanes.Add(New myTaskPaneControl(), taskPaneTitle)
CreatedPanes(key) = pane
End If
Return CreatedPanes(key)
End Function
我认为同样的逻辑也适用于 Excel,因此我将把这个标签添加到问题中。
is created but instead I need this task pane to be the same as in the other presentation window.
看来您只需要为自定义任务窗格实现单例模式。 IE。为任务窗格的所有其他实例共享相同的信息以使数据保持最新。
PowerPoint 在不同的文档框架中显示每个文档 window。当您为这些应用程序创建自定义任务窗格时,自定义任务窗格仅与特定文档相关联。如果用户打开不同的文档,自定义任务窗格将隐藏,直到先前的文档再次可见。
如果要显示包含多个文档的自定义任务窗格,请在用户创建新文档或打开现有文档时创建自定义任务窗格的新实例。为此,处理在创建或打开文档时引发的事件,然后在事件处理程序中创建任务窗格。您还可以处理文档事件以根据可见的文档隐藏或显示任务窗格。
要将任务窗格与特定文档相关联 window,请使用 Add
方法创建任务窗格,然后将 DocumentWindow
(对于 PowerPoint)传递给 window参数。
要在 PowerPoint 中监视文档 windows 的状态,您可以处理以下事件:
Microsoft.Office.Interop.PowerPoint.EApplication_Event.AfterNewPresentation
Microsoft.Office.Interop.PowerPoint.EApplication_Event.AfterPresentationOpen
Microsoft.Office.Interop.PowerPoint.EApplication_Event.NewPresentation
Microsoft.Office.Interop.PowerPoint.EApplication_Event.PresentationOpen
Microsoft.Office.Interop.PowerPoint.EApplication_Event.WindowActivate
Microsoft.Office.Interop.PowerPoint.EApplication_Event.WindowDeactivate
我使用以下代码跨演示文稿管理 PowerPoint VSTO 中的不同自定义任务窗格。这很好用,例如当用户打开一个新的演示文稿时,会创建一个新的任务窗格,它不会影响任何其他打开的演示文稿任务窗格。
现在我遇到了以下情况。用户打开了一个演示文稿,现在在 PowerPoint 中为此演示文稿打开了一个额外的 window(单击“查看”、“新建 window”)。现在发生的是创建了一个新的自定义任务窗格(因为此 window 的 HWND 不同),但我需要此任务窗格与其他演示文稿中的相同 window.
问题:如何在同一演示文稿的所有 windows 之间“共享”任务窗格?
Dim CreatedPanes As New Dictionary(Of String, CustomTaskPane)
Public Function GetTaskPane(taskPaneId As String, taskPaneTitle As String) As Microsoft.Office.Tools.CustomTaskPane
Dim key As String = $"{taskPaneId}({Globals.ThisAddIn.Application.HWND})"
If Not CreatedPanes.ContainsKey(key) Then
Dim pane = Globals.ThisAddIn.CustomTaskPanes.Add(New myTaskPaneControl(), taskPaneTitle)
CreatedPanes(key) = pane
End If
Return CreatedPanes(key)
End Function
我认为同样的逻辑也适用于 Excel,因此我将把这个标签添加到问题中。
is created but instead I need this task pane to be the same as in the other presentation window.
看来您只需要为自定义任务窗格实现单例模式。 IE。为任务窗格的所有其他实例共享相同的信息以使数据保持最新。
PowerPoint 在不同的文档框架中显示每个文档 window。当您为这些应用程序创建自定义任务窗格时,自定义任务窗格仅与特定文档相关联。如果用户打开不同的文档,自定义任务窗格将隐藏,直到先前的文档再次可见。
如果要显示包含多个文档的自定义任务窗格,请在用户创建新文档或打开现有文档时创建自定义任务窗格的新实例。为此,处理在创建或打开文档时引发的事件,然后在事件处理程序中创建任务窗格。您还可以处理文档事件以根据可见的文档隐藏或显示任务窗格。
要将任务窗格与特定文档相关联 window,请使用 Add
方法创建任务窗格,然后将 DocumentWindow
(对于 PowerPoint)传递给 window参数。
要在 PowerPoint 中监视文档 windows 的状态,您可以处理以下事件:
Microsoft.Office.Interop.PowerPoint.EApplication_Event.AfterNewPresentation
Microsoft.Office.Interop.PowerPoint.EApplication_Event.AfterPresentationOpen
Microsoft.Office.Interop.PowerPoint.EApplication_Event.NewPresentation
Microsoft.Office.Interop.PowerPoint.EApplication_Event.PresentationOpen
Microsoft.Office.Interop.PowerPoint.EApplication_Event.WindowActivate
Microsoft.Office.Interop.PowerPoint.EApplication_Event.WindowDeactivate