C # VSTO-Powerpoint-TaskPanes в отдельных окнах. - PullRequest
2 голосов
/ 09 марта 2012

Я создаю VSTO для своей компании и столкнулся с интересной проблемой, с которой я мог бы помочь. Я постараюсь объяснить это в меру своих возможностей. У меня прямо сейчас настроен AddIn для создания 2 customTaskPanes при запуске через события Application.AfterNewPresentation. И возможность скрывать / показывать их на основе пользовательского ввода с помощью кнопок-переключателей на ленте.

Теперь, когда я запускаю первый PowerPoint 2010 под названием «Presentation1», все работает отлично, я могу показать / скрыть панели задач, и все вставляется так, как должно. Теперь я открываю второй шаблон под названием «Presentation2» (чтобы помочь в этом разобраться). Все снова отлично работает, я могу показать / скрыть панели задач, и все вставляется нормально. Если я возвращаюсь к «Presentation1», вставки и все работает нормально, но когда мне нужно скрыть / показать панели задач, он скрывает / показывает их на «Presentation2». И если я создаю «Presentation3», происходит то же самое, но и «Presentation1», и «Presentation2» управляют панелями задач Presentation3. И если я закрою «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 Ответ

2 голосов
/ 09 марта 2012

В PowerPoint 2007 пользовательские панели задач являются общими для всех окон презентации .Если вы хотите, чтобы для каждой презентации были назначены отдельные области задач, вам необходимо обработать соответствующие события (WindowActivate, PresentationClose и т. Д.).Вам также нужно будет управлять списком всех панелей задач, которые вы создали, чтобы вы могли показать / скрыть соответствующую.Это на самом деле известный шаблон Outlook, который часто упоминается в мире VSTO как InspectorWrappers - или в вашем случае DocumentWindowWrapper .

Это было изменено для Powerpoint 2010, и теперь каждая область задач связана с определенным окном.См. эту статью .

Ваша ошибка в том, что Globals.ThisAddIn.WebFormTaskPane не обязательно соответствует текущей панели задач презентаций - вам нужно найти соответствующую панель задач в управляемом списке (как упомянуто выше ).Когда вы создаете новую область задач (AfterNewPresentation), добавьте ее в свою коллекцию CustomTaskPane и предоставьте средства для ее получения.

public partial class ThisAddIn
{    
  private Dictionary<PowerPoint.DocumentWindow, DocumentWindowWrapper> pptWrappersValue =
            new Dictionary<PowerPoint.DocumentWindow, DocumentWindowWrapper>();
}
...