2012-03-08 62 views
2

我爲我的公司創建了VSTO,並且遇到了一個有趣的問題,我可以使用一些幫助。我會盡我所能解釋這一點。我現在設置了AddIn,它通過Application.AfterNewPresentation事件啓動後創建2個customTaskPanes。並且能夠根據來自功能區上的togglebutton的用戶輸入來隱藏/顯示這些內容。單獨窗口中的C#VSTO-Powerpoint-TaskPanes。

現在,當我啓動名爲「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; 
    } 

回答

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集合中,並提供檢索它的方法。在正確的方向點我已經看到了這個鏈接之前,試圖通過Outlook一個工作我的方式,但做與PowerPoint包裝類工作

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

感謝是我繼續加油,由於掛了他們的幸福在Powerpoint中沒有檢查員。我會再次嘗試謝謝。 – KJones 2012-03-09 15:25:45

+0

@KJones - 很高興幫助你!請將此標記爲答案,以便它可以幫助未來遇到同樣問題的人。 – SliverNinja 2012-03-09 15:37:00

+0

好吧我在從Outlook到Powerpoint的一些東西翻譯中丟失了。主要在包裝類中,比如添加Close事件。 PPT中的哪一個是PresentationClose,但是如何指定哪個「檢查器」用作PPT事件處理程序將不接受任何參數。與PPR一樣,ManagingRibbon也沒有使用這個功能。 – KJones 2012-03-09 17:26:14