C#VSTO-Powerpoint-TaskPanes位于不同的窗口中。

时间:2012-03-08 21:44:58

标签: c# vsto powerpoint

我正在为我的公司创建一个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;
    }

1 个答案:

答案 0 :(得分:2)

在PowerPoint 2007中,自定义task panes are shared across all presentation windows。如果您希望为每个演示文稿分配单独的任务窗格,则需要处理相应的事件(WindowActivatePresentationClose等)。您还需要管理已创建的所有任务窗格的列表,以便显示/隐藏适当的窗格。这实际上是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>();
}