我正在为我的公司创建VSTO,并且遇到了一个有趣的问题,可以帮助您。我将尽我所能解释这一点。我现在已经设置了AddIn,以便在通过Application.AfterNewPresentation事件启动时创建2个customTaskPanes。并且具有基于功能区上的切换按钮的用户输入来隐藏/显示这些内容的功能。
现在,当我启动第一个名为“ 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;
}
最佳答案
在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>();
}
关于c# - 在单独的窗口中使用C#VSTO-Powerpoint-TaskPanes。,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9625466/