我正在为我的公司创建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。如果要为每个演示文稿分配单独的任务窗格,则需要处理相应的事件(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>();
}

关于c# - 在单独的窗口中使用C#VSTO-Powerpoint-TaskPanes。,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9625466/

10-10 04:53