我正在为我的公司创建一个VSTO,并遇到了一个有趣的问题,我可以使用它。我会尽力解释这个问题。我现在正在设置AddIn,以便在通过Application.AfterNewPresentation事件启动时创建2个customTaskPanes。并且能够根据功能区上togglebuttons的用户输入隐藏/显示这些内容。
现在当我启动第一个名为“Presentation1”的PowerPoint 2010时,一切都很好,我可以显示/隐藏TaskPanes,一切都按照应有的方式插入。现在我打开另一个名为“Presentation2”的模板(为了帮助保持原状)一切都很好,我可以显示/隐藏TaskPanes,一切都插入正常。如果我回到“Presentation1”,插入和一切功能都很好,但当我隐藏/显示TaskPanes时,它隐藏/显示在“Presentation2”上。如果我创建一个“Presentation3”,同样的事情会发生,但“Presentation1”和“Presentation2”控制“Presentation3”TaskPanes。如果我关闭“Presentation2”和“Presentation3”,“Presentation1”按钮根本不显示/隐藏任何内容。
ThisAddIn中的代码
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
Application.AfterNewPresentation += new PowerPoint.EApplication_AfterNewPresentationEventHandler(Application_AfterNewPresentation);
}
private void Application_AfterNewPresentation(PowerPoint.Presentation Pres)
{
PowerPoint.Application app = Pres.Application;
PowerPoint.DocumentWindow docWin = null;
foreach (PowerPoint.DocumentWindow win in Globals.ThisAddIn.Application.Windows)
{
if (win.Presentation.Name == app.ActivePresentation.Name)
{
docWin = win;
}
}
this.myWebForm = new SearchWebForm();
this.myWebFormTaskPane = this.CustomTaskPanes.Add(myWebForm, "Search ",docWin);
this.myWebFormTaskPane.DockPosition = Office.MsoCTPDockPosition.msoCTPDockPositionRight;
this.myWebFormTaskPane.Width = 345;
this.myWebFormTaskPane.VisibleChanged += new EventHandler(WebFormTaskPane_VisibleChanged);
}
private void WebFormTaskPane_VisibleChanged(object sender, System.EventArgs e)
{
Globals.Ribbons.Ribbon1.searchButton.Checked = myWebFormTaskPane.Visible;
if (Globals.Ribbons.Ribbon1.searchButton.Checked == true)
{
myWebForm.SearchForm_Navigate();
}
}
然后这是在功能区
private void searchButton_Click(object sender, RibbonControlEventArgs e)
{
Globals.ThisAddIn.WebFormTaskPane.Visible = ((RibbonToggleButton)sender).Checked;
}
答案 0 :(得分:2)
在PowerPoint 2007中,自定义task panes are shared across all presentation windows。如果您希望为每个演示文稿分配单独的任务窗格,则需要处理相应的事件(WindowActivate
,PresentationClose
等)。您还需要管理已创建的所有任务窗格的列表,以便显示/隐藏适当的窗格。这实际上是well-known Outlook pattern frequently referred to in VSTO-world as InspectorWrappers - 或者在您的情况下是 DocumentWindowWrapper 。
这已针对Powerpoint 2010进行了更改,现在每个任务窗格都与特定窗口相关联。请参阅this article。
您的错误是Globals.ThisAddIn.WebFormTaskPane
不一定与当前演示文稿任务窗格相对应 - 您需要在托管列表中查找正确的任务窗格(,如上所述)。创建新任务窗格(AfterNewPresentation
)时,将其添加到CustomTaskPane
集合中并提供检索它的方法。
public partial class ThisAddIn
{
private Dictionary<PowerPoint.DocumentWindow, DocumentWindowWrapper> pptWrappersValue =
new Dictionary<PowerPoint.DocumentWindow, DocumentWindowWrapper>();
}