2017-12-17 7 views
0

Ich habe ein PowerPoint-VSTO-Addin mit einem benutzerdefinierten Aufgabenbereich erstellt - und ein Menüband, in dem ein Umschaltknopf den Anzeige-/Verdecken-Status des benutzerdefinierten Aufgabenbereichs definiert. Grundlage dafür waren die Microsoft Walkthrough-Informationen für den benutzerdefinierten Aufgabenbereich und die Synchronisierung der Multifunktionsleiste mit dem Aufgabenbereich. Bis jetzt läuft alles gut mit dem ersten PowerPoint-Fenster. Ich kann den Aufgabenbereich im zweiten und dritten PowerPoint-Fenster anzeigen, aber die Umschaltfläche in der Multifunktionsleiste reagiert nur auf das zuletzt geöffnete/erstellte PowerPoint-Fenster und nicht auf den im aktiven PowerPoint-Fenster angezeigten/ausgeblendeten Aufgabenbereich.C# VSTO-Powerpoint-TaskPanes in separaten Fenstern

Ich habe eine anderen Thread gefunden, die hier genau das gleiche Problem, erklärt: C# VSTO-Powerpoint-TaskPanes in separate windows.

Aber ich verstehe nicht, die Antwort weder ich weiß nicht, wie ein Powerpoint-Inspector Wrapper zu implementieren.

Ich bin neu in C# und nur ein Keyword wie "Inspector Wrapper" ist zu wenig für mich. Ich bin schon Stunden damit beschäftigt, im Internet zu suchen, war aber bis jetzt nicht erfolgreich.

Gibt es eine Chance, ein KOMPLETT Code-Beispiel für PowerPoint zu bekommen, wie das funktioniert, was muss getan werden?

-Code hinzugefügt: Ich habe den Code aus dem Allgemeinen Durchlauf: https://msdn.microsoft.com/en-us/library/bb608590.aspx und änderte es mit einem Ereignis für neue Präsentationen:

Der Code für die ThisAddIn.cs ist wie folgt:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml.Linq; 
using PowerPoint = Microsoft.Office.Interop.PowerPoint; 
using Office = Microsoft.Office.Core; 

namespace PowerPointAddIn1 
{ 
    public partial class ThisAddIn 
    { 
     private TaskPaneControl taskPaneControl1; 
     private Microsoft.Office.Tools.CustomTaskPane taskPaneValue; 

     private void ThisAddIn_Startup(object sender, System.EventArgs e) 
     { 
      this.Application.AfterNewPresentation += new Microsoft.Office.Interop.PowerPoint.EApplication_AfterNewPresentationEventHandler(NewPresentation); 
      //taskPaneControl1 = new TaskPaneControl(); 
      //taskPaneValue = this.CustomTaskPanes.Add(taskPaneControl1, "MyCustomTaskPane"); 
      //taskPaneValue.VisibleChanged += new EventHandler(taskPaneValue_VisibleChanged); 
     } 

     void NewPresentation(Microsoft.Office.Interop.PowerPoint.Presentation oPres) 
     { 

      PowerPoint.Application app = this.Application; 
      PowerPoint.DocumentWindow docWin = null; 

      foreach (PowerPoint.DocumentWindow win in Globals.ThisAddIn.Application.Windows) 
      { 
       if (win.Presentation.Name == app.ActivePresentation.Name) 
       { 
        docWin = win; 
       } 
      } 

      this.taskPaneControl1 = new TaskPaneControl(); 
      this.taskPaneValue = this.CustomTaskPanes.Add(taskPaneControl1, "MyCustomTaskPane", docWin); 
      this.taskPaneValue.VisibleChanged += new EventHandler(taskPaneValue_VisibleChanged); 
     } 

     private void taskPaneValue_VisibleChanged(object sender, System.EventArgs e) 
     { 
      Globals.Ribbons.ManageTaskPaneRibbon.toggleButton1.Checked = 
      taskPaneValue.Visible; 
     } 

     public Microsoft.Office.Tools.CustomTaskPane TaskPane 
     { 
      get 
      { 
       return taskPaneValue; 
      } 
     } 

     private void ThisAddIn_Shutdown(object sender, System.EventArgs e) 
     { 
     } 

     #region VSTO generated code 

     /// <summary> 
     /// Required method for Designer support - do not modify 
     /// the contents of this method with the code editor. 
     /// </summary> 
     private void InternalStartup() 
     { 
      this.Startup += new System.EventHandler(ThisAddIn_Startup); 
      this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown); 
     } 

     #endregion 
    } 
} 
+0

Bitte teilen Sie Ihre Code-Studien mit uns – Marcel

+0

ich den Code aus dem Generaldurchlauf nahm: https://msdn.microsoft.com/en-us/library/bb608590.aspx –

+0

Sind Sie auf 2007 ausgerichtet? Wenn Sie es nicht sind, sagt die akzeptierte Antwort, dass die Lösung mit der 'CustomTaskPane'-Sammlung zu tun hat, nicht mit' InspectorWrapper'. – Chris

Antwort

0

Ich erinnere mich so gut an die Lernkurve. Hier ist ein Beispiel, das Ihrer Meinung nach Ihr Problem anspricht. Sie müssen den Aufgabenbereich mit dem Dokument verknüpfen. Ich verließ mich hier auf das Benennungsschema für neue Dokumente, aber eine DocumentVariable wäre eine viel bessere Wahl (sie werden am Ende der aktuellen Sitzung verworfen). Fügen Sie der Präsentation eine Variable hinzu, speichern Sie die ID des Aufgabenbereichs im Steuerelement und vergleichen Sie sie, um den richtigen Aufgabenbereich zu erhalten.

Sie benötigen ein XML-Ribbon (könnte wahrscheinlich einen Ribbon Designer verwenden, aber die sind nicht so gut). Ich entfernte einen Teil des Boilerplate und irrelevanten Codes von diesem.

ThisAddIn.cs:

namespace PowerPointAddIn1 
{ 
    public partial class ThisAddIn 
    { 
     public static int counter = 0; 

     private void ThisAddIn_Startup(object sender, System.EventArgs e) 
     { 
      this.Application.AfterNewPresentation += Application_AfterNewPresentation; 
     } 

     private void Application_AfterNewPresentation(PowerPoint.Presentation Pres) 
     { 
      int count = ++counter; 

      UserControl1 uc = new UserControl1("task pane " + count); 
      CustomTaskPane ctp = CustomTaskPanes.Add(uc, "custom task pane " + count); 
      ctp.Visible = true; 
     } 

     private void ThisAddIn_Shutdown(object sender, System.EventArgs e) 
     { 
     } 

     protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject() 
     { 
      return new Ribbon1(); 
     } 
    } 
} 

Ribbon1.cs:

namespace PowerPointAddIn1 
{ 
    [ComVisible(true)] 
    public class Ribbon1 : Office.IRibbonExtensibility 
    { 
     private Office.IRibbonUI ribbon; 

     public Ribbon1() 
     { 
     } 

     public void toggleTaskPane(Office.IRibbonControl control, bool enabled) 
     { 
      var CTPs = Globals.ThisAddIn.CustomTaskPanes; 
      var pres = Globals.ThisAddIn.Application.ActivePresentation; 

      foreach (var x in CTPs) 
      { 
       if (pres.Name.EndsWith(x.Title.Replace("custom task pane ", ""))) 
       { 
        x.Visible = enabled; 
       } 
      } 
     } 

     public bool isPressed(Office.IRibbonControl control) 
     { 
      var CTPs = Globals.ThisAddIn.CustomTaskPanes; 
      var pres = Globals.ThisAddIn.Application.ActivePresentation; 
      foreach (var x in CTPs) 
      { 
       if (pres.Name.EndsWith(x.Title.Replace("custom task pane ", ""))) 
       { 
        return x.Visible; 
       } 
      } 
      return false; 
     } 
    } 
} 

Ribbon1.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="Ribbon_Load"> 
    <ribbon> 
    <tabs> 
     <tab idMso="TabAddIns"> 
     <group id="MyGroup" 
       label="My Group"> 
      <checkBox id="mycheckbox" label="show task pane" onAction="toggleTaskPane" getPressed="isPressed" /> 
     </group> 
     </tab> 
    </tabs> 
    </ribbon> 
</customUI> 

UsreControl1.cs (hat nur ein Etikett drauf):

namespace PowerPointAddIn1 
{ 
    public partial class UserControl1 : UserControl 
    { 
     public UserControl1(string labelValue) 
     { 
      InitializeComponent(); 

      label1.Text = labelValue; 
     } 
    } 
} 
+0

Vielen Dank Chris für Ihre Eingabe - ich werde dieses kommende Wochenende überprüfen. Vielleicht haben Sie eine Idee - wie Sie oben sehen können, habe ich den neuen Aufgabenbereich mit dem Fensterobjekt hinzugefügt - ich dachte, dass dies der Link zu dem aktuellen aktiven Fenster ist, als es erstellt wurde - und das sah ich auch in den Fenstereigenschaften (Präsentation 1). aber sobald ich eine neue Präsentation erstellt habe und mit diesem Ereignis einen neuen benutzerdefinierten Aufgabenbereich mit dem aktuellen Fenster auch das erste ctp bekam im Fenster die neue Präsentation (2) und nicht die Präsentation 1 mehr. Warum wird das aktualisiert? Kann dies vermieden werden? –

+0

Chris, Ihr Tipp mit der Dokumentvariablen (in PowerPoint = Tags auf Präsentationsebene) hat mir geholfen - so kann ich jetzt CTP und Presentation.Tag vergleichen und jetzt kann ich CTP für jede Präsentation einzeln im selben Ribbon ein- und ausblenden Umschaltknopf. Die nächsten Schritte sind die Verwaltung der CTPs, wenn das Dokument geschlossen wurde usw. Frohe Weihnachten! –

0

Ich möchte nur meine Ergebnisse teilen, was jetzt für mich funktioniert (Danke an Chris, der mir wertvolle Inputs gegeben hat). Ich habe eine customtaskpanel-Verwaltung, die für jede Präsentation funktioniert. Die einzige Sache, die noch nicht implementiert ist, ist, wenn ein Benutzer das Dokument in einem separaten Fenster öffnet (Ansicht/Neues Fenster). Dieser weiß ich nicht, wie man es schafft. Soweit ich es testen kann, funktioniert das jetzt. hier ist der Link auf die gesamte Lösung: https://happypc-my.sharepoint.com/personal/roger_heckly_happy-pc_ch/_layouts/15/guestaccess.aspx?docid=0426d40dc5df74d66ba42a3b928111ce8&authkey=Aa6yX6QWUnqXp1jcUfGveL8

Bitte beachten Sie - ich Anfänger bin - also, wenn Sie Feedback haben/Eingänge lassen Sie es mich wissen.Sicherlich könnten einige Code geschrieben werden einfacher usw.

Verwandte Themen