Anpassungen auf Dokumentebene zu Add-Ins migrieren

Veröffentlicht: 05. Feb 2007

Von Brian A. Randell

Erfahren Sie, wie Sie Ihre dokumentbasierten Lösungen zu Add-Ins auf Anwendungsebene migrieren können. Mit Add-Ins können neue Features von 2007 Microsoft Office System wie Aufgabenbereiche auf Anwendungsebene und die Multifunktionsleiste angepasst werden.

Auf dieser Seite

Übersicht: Entwicklungstools für Microsoft Office Übersicht: Entwicklungstools für Microsoft Office
Entwicklung einer Office 2003-Projektmappe Entwicklung einer Office 2003-Projektmappe
Entwurfsänderungen Entwurfsänderungen
Schlussbemerkung Schlussbemerkung
Der Autor Der Autor
Weitere Ressourcen Weitere Ressourcen

Übersicht: Entwicklungstools für Microsoft Office

Mit jeder Version von Microsoft Visual Studio-Tools für Microsoft Office System (Visual Studio-Tools für Office) wurden Entwicklern, die Microsoft Visual Basic und Microsoft Visual C# zur Programmierung verwenden, neue Möglichkeiten zur Erweiterung und Optimierung von Microsoft Office zur Verfügung gestellt. Die bisher aktuelle Version, Microsoft Visual Studio 2005- Tools für Microsoft Office System, bietet mehrere neue Features, einschließlich Entwurfszeitunterstützung für Microsoft Office Excel 2003- und Microsoft Office Word 2003-Dokumente, Unterstützung des Arbeitsbereichs Dokumentenaktionen, umfassender Unterstützung der Datenbindung, erweiterter Bereitstellungsoptionen und Smarttagunterstützung (weitere Informationen in englischer Sprache finden Sie unter What's New in Visual Studio 2005 Tools for Office).

Die Zeit steht jedoch nicht still. Derzeit (im Mai 2006) ist bereits eine späte Betaversion von 2007 Microsoft Office System verfügbar. Wenn Sie diesen Artikel auf MSDN Online lesen, ist 2007 Microsoft Office System bereits fertig. Mit dieser neuen Office-Version werden Hunderte neue Optionen für Entwickler eingeführt. Um Entwicklern von verwaltetem Code diese neuen Features so bald wie möglich zur Verfügung zu stellen, bietet Microsoft eine aktualisierte Version von Visual Studio Tools für Office an, die als Microsoft Visual Studio 2005 Tools für Microsoft Office System (oder auch Visual Studio 2005 Tools for Office Second Edition) bezeichnet wird. Mit dieser neuen Version wird das Toolset von Visual Studio-Tools für Office vor der Verfügbarkeit der nächsten Vollversion um zusätzliche Programmieroptionen erweitert.

HinweisHinweis:
Dieser Artikel wurde mit Visual Studio 2005-Tools für Office (die derzeit veröffentlichte Version) und Visual Studio 2005 Tools for Office Second Edition erarbeitet und getestet. Möglicherweise erhalten Sie mit den neueren Versionen zum Teil andere Ergebnisse.

Visual Studio 2005 Tools for Office Second Edition bietet die lange erwartete Unterstützung für die Entwicklung von Add-Ins auf Anwendungsebene, die Modifizierung der Multifunktionsleiste und die Entwicklung von Aufgabenbereichen auf Anwendungsebene. Tabelle 1 enthält eine vollständige Liste der unterstützten Hostanwendungen. Sie zeigt, dass Sie verwaltete Anwendungs-Add-Ins für die nächste Office-Version und auch für einige Microsoft Office 2003-Anwendungen erstellen können.

Tabelle 1: Hosts für Anwendungs-Add-Ins

Host

Visual Studio 2005 Tools for Office Second Edition

Microsoft Office Access 2003

Nein

Microsoft Office Excel 2003

Ja

Microsoft Office FrontPage 2003

Nein

Microsoft Office Outlook 2003

Ja (Es ist auch möglich, Anwendungs-Add-Ins für Outlook 2003 mit Visual Studio 2005-Tools für Office ohne Einsatz von Visual Studio 2005 Tools for Office Second Edition zu erstellen).

Microsoft Office PowerPoint 2003

Ja

Microsoft Office Project 2003

Nein

Microsoft Office Publisher 2003

Nein

Microsoft Office Visio 2003

Ja

Microsoft Office Word 2003

Ja

Microsoft Office Access 2007

Nein

Microsoft Office Excel 2007

Ja

Microsoft Office InfoPath 2007

Ja

Microsoft Office Outlook 2007

Ja

Microsoft Office PowerPoint 2007

Ja

Microsoft Office Project 2007

Nein

Microsoft Office Publisher 2007

Nein

Microsoft Office SharePoint Designer 2007

Nein

Microsoft Office Visio 2007

Ja

Microsoft Office Word 2007

Ja

Wie Sie sehen können, bietet die Zukunft eine Menge neuer und spannender Möglichkeiten. Mit Visual Basic oder Visual C# können Sie jetzt umfassendere und möglicherweise noch bessere Lösungen als je zuvor bereitstellen. Diese Optionen sind jedoch manchmal etwas verwirrend – insbesondere wenn Sie bereits mit einer früheren Version der Tools eine VSTO-Projektmappe erstellt haben.

Der Aufgabenbereich Dokumentenaktionen ist ein hervorragendes Beispiel für einen Bereich, auf den Sie jetzt leichter zugreifen können. In Microsoft Office XP wurde der Aufgabenbereich als ein Ort eingeführt, an dem häufig verwendete Befehle in einem Element der Benutzeroberfläche gruppiert werden können, das während der aktiven Arbeit an einem Dokument verfügbar ist. Der Vorteil im Vergleich zu Dialogfeldern ist offensichtlich – im Gegensatz zu modalen Dialogfeldern können die Benutzer während der Verwendung des Aufgabenbereichs mit ihrer Arbeit fortfahren. Darüber hinaus ermöglichen es viele Aufgabenbereiche den Benutzern (z. B. der Aufgabenbereich Formatvorlagen und Formatierung), bei der Verwendung des Aufgabenbereichs Aktualisierungen ihrer Dokumente unmittelbar anzuzeigen. In Office 2003 wurde die Möglichkeit zur Programmierung von SmartDocuments eingeführt, sodass Sie einen eigenen benutzerdefinierten Aufgabenbereich Dokumentenaktionen erstellen können. Sie können einen Aufgabenbereich Dokumentenaktionen an ein Word 2003-Dokument oder an eine Excel 2003-Arbeitsmappe anfügen. Microsoft macht das grundlegende SmartDocument-API (Application Programming Interface) über einen COM-basierten Satz von Schnittstellen verfügbar. Die COM-Technologie ist quasi ein alter Bekannter. Manchmal entwickeln sich Bekannte jedoch auseinander. Man geht gelegentlich zusammen aus, aber ein täglicher Kontakt ist nicht zu erwarten. Die gute Nachricht ist, dass das Microsoft-Team von Visual Studio-Tools für Office genauso denkt. Sein Ziel besteht in der Bereitstellung eines umfassenden, verwalteten APIs, mit dem Sie großartige Lösungen unter Einbindung von Microsoft Office System entwickeln können, ohne sich lange mit der COM-Technologie befassen zu müssen.

 

Entwicklung einer Office 2003-Projektmappe

Visual Studio-Tools für Office bietet verwaltete Unterstützung für Dokumentenaktionen-Aufgabenbereiche in Excel 2003 und Word 2003. Die Funktionsmöglichkeiten von Dokumentenaktionen-Aufgabenbereichen lassen sich am besten anhand eines Beispiels erklären. Das Beispiel, das diesem Artikel zugrunde liegt, ist eine einfache Projektmappe zur Erstellung von Zitatangaben. Sie übergeben eine ISBN an die Projektmappe, und die Projektmappe liefert alle Daten, die für einen entsprechenden Literaturnachweis in einem Word-Dokument erforderlich sind. Dies wird durch Einbindung des öffentlichen (und kostenlosen) XML-Webdiensts von Amazon.com erreicht. Zuerst erstellen Sie die Projektmappe mit Visual Studio-Tools für Office. Dann migrieren Sie diese mithilfe von Visual Studio 2005 Tools for Office Second Edition zu Office 2007.

Die nachstehend beschriebene Projektmappe ist keine Universallösung. In diesem Beispiel erfahren Sie zunächst, wie Sie eine dokumentspezifische Projektmappe für Word 2003 mit einem Aufgabenbereich Dokumentenaktionen erstellen. Dieser erste Entwurf ist einfach. Dann wird die Projektmappe in Office Word 2007 erläutert, diesmal unter Verwendung des neuen Aufgabenbereichs auf Anwendungsebene. Bei der Word 2007-Projektmappe wird ein angepasster Entwurf verwendet, den Sie in Ihren Office 2003-Projektmappen nutzen können. In einigen Fällen ist eine Migration wie die in diesem Beispiel sinnvoll. In anderen Fällen kann eine Projektmappe, bei der ein Aufgabenbereich Dokumentenaktionen verwendet wird, geeigneter sein. Unabhängig davon lohnt sich die Entwicklung einer zur Wiederverwendung vorgesehenen, angepassten Projektmappe auf jeden Fall.

Erstellen Sie die Projektmappe entweder mit Visual Basic oder mit Visual C#. Um dieses Beispiel eigenständig nachvollziehen zu können, benötigen Sie einen kostenlosen Entwicklerschlüssel für die Webdienste von Amazon.com. Entsprechende Anleitungen und weitere Informationen finden Sie auf der Amazon Web Services-Seite.

HinweisHinweis:
Obwohl Code in Visual Basic und Visual C# auf sehr ähnliche Weise geschrieben werden kann, werden bei dem Code in diesem Artikel generell integrierte Sprachkonstrukte wie die Visual Basic MsgBox- und WithEvents-Features anstelle einer Microsoft .NET Framework-Alternative verwendet.

So erstellen Sie die Office 2003-Projektmappe

  1. Zeigen Sie im Menü Datei auf Neu, und klicken Sie dann auf Projekt.

  2. Erweitern Sie im Dialogfeld Neues Projekt in der Liste der Projekttypen entweder den Knoten Visual Basic oder den Knoten Visual C#.

  3. Wählen Sie in der Liste der Projekttypen den Knoten Office aus.

  4. Wählen Sie im Bereich Vorlagen die Option Word-Dokument aus.

  5. Geben Sie den Namen Citations und einen Speicherort für Ihre Anpassung an, und klicken Sie dann auf OK.

    Der Projekt-Assistent aus Visual Studio Tools for Office wird geöffnet.

  6. Klicken Sie auf OK, um die Standardeinstellungen zu übernehmen.

    Nach einigen Momenten wird das Word 2003-Dokument in Microsoft Visual Studio 2005 als Registerkartendokument geöffnet.

  7. Klicken Sie im Menü Ansicht auf Code, um die Codedatei für das Dokument zu öffnen.

Die Anfangsklasse, ThisDocument, ist abgesehen von zwei Ereignishandlern leer: ThisDocument_Startup und ThisDocument_Shutdown.

Als Erstes definieren Sie Variablen auf Klassenebene für die Windows Forms-Steuerelemente, die im Arbeitsbereich Dokumentenaktionen enthalten sein sollen. Fügen Sie acht Windows Forms-Steuerelemente hinzu: zwei Schaltflächen, ein Textfeld und fünf Labels. Im Textfeld geben die Benutzer die ISBN der Bücher ein, nach denen sie suchen möchten. Eine Schaltfläche ermöglicht es den Benutzern, die ISBN an den Webdienst zu senden. Über die andere Schaltfläche wird der Literaturverweis an der aktuellen Cursorposition in das Word-Dokument eingefügt. Vier der Labels dienen dazu, den Hauptautor (vom Webdienst ermittelt), den Titel, den Herausgeber und das Veröffentlichungsdatum des Buchs anzuzeigen. Anhand des letzten Labels wird der Benutzer über den Status des Webdienstaufrufs informiert, während die Buchinformationen abgerufen werden.

Die folgenden Codeblöcke zeigen alle Änderungen an der ThisDocument-Klasse:

Visual Basic

Public Class ThisDocument
Private WithEvents btnGetBookInfo As Button
Private WithEvents btnPutInfoInDoc As Button
Private lblGetBookInfoStatus As Label

Private txtISBN As TextBox
Private lblAuthor As Label
Private lblPublisher As Label
Private lblTitle As Label
Private lblYearPublished As Label

Private Sub ThisDocument_Startup(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Startup

End Sub

Private Sub ThisDocument_Shutdown(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Shutdown

End Sub

End Class

C#

namespace CitationsCS
{
public partial class ThisDocument
{
private Button btnGetBookInfo;
private Button btnPutInfoInDoc;
private Label lblGetBookInfoStatus;

private TextBox txtISBN;
private Label lblAuthor;
private Label lblPublisher;
private Label lblTitle;
private Label lblYearPublished;

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

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

#region VSTO Designer 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(ThisDocument_Startup);
this.Shutdown += new System.EventHandler(ThisDocument_Shutdown);
}

#endregion
}
}

Im ThisDocument_Startup-Ereignishandler werden die Steuerelemente nach Bedarf initialisiert. Dann fügt der Code mithilfe der Add-Methode der Controls-Auflistung des ActionsPane-Objekts die einzelnen Steuerelemente in der Reihenfolge, in der sie angezeigt werden, dem Arbeitsbereich Dokumentenaktionen von oben nach unten hinzu.

Visual Basic

Public Class ThisDocument
Private Sub ThisDocument_Startup(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Startup

btnGetBookInfo = New Button()
btnGetBookInfo.Text = "Get Book Data"

btnPutInfoInDoc = New Button()
btnPutInfoInDoc.Text = "Put Book Data"
btnPutInfoInDoc.Enabled = False

lblGetBookInfoStatus = New Label
lblGetBookInfoStatus.Text = "Ready"
txtISBN = New TextBox
txtISBN.Text = String.Empty
lblAuthor = New Label
lblYearPublished = New Label
lblPublisher = New Label
lblTitle = New Label

With ActionsPane.Controls
.Add(btnGetBookInfo)
.Add(btnPutInfoInDoc)
.Add(lblGetBookInfoStatus)
.Add(txtISBN)
.Add(lblAuthor)
.Add(lblYearPublished)
.Add(lblPublisher)
.Add(lblTitle)
End With
End Sub

Private Sub ThisDocument_Shutdown(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Shutdown

End Sub

End Class

C#

public partial class ThisDocument
{
private void ThisDocument_Startup(object sender, System.EventArgs e)
{
btnGetBookInfo = new Button();
btnGetBookInfo.Text = "Get Book Data";
btnGetBookInfo.Click += new EventHandler(btnGetBookInfo_Click);

btnPutInfoInDoc = new Button();
btnPutInfoInDoc.Text = "Put Book Data";
btnPutInfoInDoc.Enabled = false;
btnPutInfoInDoc.Click += new EventHandler(btnPutInfoInDoc_Click);

lblGetBookInfoStatus = new Label();
lblGetBookInfoStatus.Text = "Ready";
txtISBN = new TextBox();
txtISBN.Text = string.Empty;
lblAuthor = new Label();
lblPublisher = new Label();
lblTitle = new Label();
lblYearPublished = new Label();

ActionsPane.Controls.Add(btnGetBookInfo);
ActionsPane.Controls.Add(btnPutInfoInDoc);
ActionsPane.Controls.Add(lblGetBookInfoStatus);
ActionsPane.Controls.Add(txtISBN);
ActionsPane.Controls.Add(lblAuthor);
ActionsPane.Controls.Add(lblPublisher);
ActionsPane.Controls.Add(lblYearPublished);
ActionsPane.Controls.Add(lblTitle);
}
void btnPutInfoInDoc_Click(object sender, EventArgs e)
{
throw new Exception("The method or operation is not implemented.");
}

void btnGetBookInfo_Click(object sender, EventArgs e)
{
throw new Exception("The method or operation is not implemented.");
}

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

An diesem Punkt ist genug Code für einen Probelauf vorhanden. Drücken Sie die Taste F5, um Word zu starten und die Projektmappe auszuführen. Der Aufgabenbereich Dokumentenaktionen wird geöffnet, und alle Steuerelemente sind wie in Abbildung 1 angeordnet.

Abbildung 1: Der fertig gestellte Aufgabenbereich „Dokumentenaktionen“
Abbildung 1: Der fertig gestellte Aufgabenbereich „Dokumentenaktionen“

Nachdem Sie die grundlegende Benutzeroberfläche definiert haben, fügen Sie die Logik zum Abrufen der Buchinformationen vom Webdienst von Amazon.com hinzu. Um den Benutzer über den Fortschritt des Buchdatenabrufs auf dem Laufenden zu halten, zeigt ein Label-Steuerelement Statusinformationen an. Durch den nächsten Codeblock wird eine generische Hilfsprozedur erstellt, um die Text-Eigenschaft der Bezeichnung zu ändern und sie zu aktualisieren.

Visual Basic

Public Class ThisDocument
Private Sub UpdateStatus(ByVal Message As String)
lblGetBookInfoStatus.Text = Message
lblGetBookInfoStatus.Update()
End Sub
End Class

C#

public partial class ThisDocument
{
private void UpdateStatus(string Message)
{
lblGetBookInfoStatus.Text = Message;
lblGetBookInfoStatus.Update();
}
}

Um den Webdienst von Amazon.com zu verwenden, fügen Sie dem Projekt einen Webverweis hinzu.

So fügen Sie einen Webdienstverweis hinzu

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektknoten, und klicken Sie dann auf Webverweis hinzufügen.

  2. Geben Sie im Dialogfeld Webverweis hinzufügen im Feld URL die folgende Adresse ein, und klicken Sie dann auf Gehe zu:

    http://webservices.amazon.com/AWSECommerceService/2006-05-17/AWSECommerceService.wsdl

    HinweisHinweis:
    Als dieser Artikel geschrieben wurde, lag bei der aktuellen Version der WSDL-Definition des E-Commerce-Webdiensts von Amazon.com ein Problem vor, das ihre Verwendung über die generierte Webdienst-Proxyklasse verhinderte. Daher handelt es sich hierbei um die neueste, bei Verfassung des Artikels lauffähige Version. Sie finden die aktuelle WSDL-Version unter http://webservices.amazon.com/AWSECommerceService/AWSECommerceService.wsdl.

  3. Wenn die Webdienstbeschreibung angezeigt wird, geben Sie im Feld Webverweisname den Namen AmazonECS4 ein. Klicken Sie dann auf Verweis hinzufügen, um den Vorgang abzuschließen und die lokale Proxyklasse zu generieren.

Nachdem der Webverweis nun bereit ist, fügen Sie der ThisDocument-Klasse die folgenden drei zusätzlichen Felder hinzu:

Visual Basic

Private Const AWS_Access_KeyId As String = "<i>Your Access Key ID</i>"
Private aws As AmazonECS4.AWSECommerceService = Nothing
Private savedISBN As String

C#

private const string AWS_Access_KeyId = "<i>Your Access Key ID</i>";
private AmazonECS4.AWSECommerceService aws = null;
private string savedISBN;

Das erste Feld ist eine Konstante, die Ihre Schlüssel-ID für den Entwicklerzugriff auf den Amazon-Webdienst darstellt. Wie bereits erwähnt, können Sie auf der Amazon Web Services-Seite einen solchen Schlüssel kostenlos anfordern. Das zweite Feld ist ein Verweis auf die lokale Amazon-E-Commerce-Proxyklasse, die Sie gerade generiert haben, und das dritte Feld wird zum Speichern der angeforderten ISBN verwendet.

Der letzte Codeabschnitt besteht aus zwei Teilen. Einer enthält den Code, der den Amazon-Webdienst aufruft. Der andere zeigt den Code, durch den die Buchinformationen dem aktuellen Dokument hinzugefügt werden.

Bei dem ersten Codeabschnitt handelt es sich um den Click-Ereignishandler für die btnGetBookInfo-Schaltfläche. Als Erstes führt der Code eine grundlegende Überprüfung der Eingabedaten durch. Durch die Prüfung soll sichergestellt werden, dass das Feld keinen Nullwert und keine leere Zeichenfolge enthält. Sie können zusätzlichen Code hinzufügen, um zu prüfen, ob der vom Benutzer eingegebene Wert eine gültige ISBN ist. Als Nächstes erstellt der Code eine Instanz der übergeordneten Amazon-Webdienstklasse und speichert einen Verweis darauf in der Klassenvariablen aws. Der Code initialisiert die ItemLookupRequest-Anforderung mit den für den Abruf der Buchinformationen erforderlichen Daten. Zu diesen Daten gehört die vom Benutzer eingegebene ISBN, die Art der Suche, die der Webdienst durchführen soll, und die Menge der vom Webdienst zurückzugebenden Daten.

Amazon.com hat den Webdienst auf Flexibilität ausgelegt. Sie können verschiedene Arten von Informationen angeben, die in Form von ResponseGroups zurückgegeben werden sollen. In diesem Add-In verfügt das ResponseGroup Medium über alle erforderlichen Daten zum Auffüllen der Steuerelemente des Aufgabenbereichs. Nachdem der Code die ItemLookupRequest-Anforderung eingerichtet hat, verpackt er die Instanz in einem ItemLookup-Objekt. Jede ItemLookupRequest-Anforderung kann bis zu zehn ItemLookupRequest-Objekte enthalten. In diesem Beispiel wird nur eines dieser Objekte verwendet. Sie geben Ihren Amazon-Webdienstschlüssel (der bereits als Klassenkonstante definiert ist) in der ItemLookupRequest-Anforderung an.

Sie haben jetzt alle Elemente definiert, die der Code für den konkreten Webdienstaufruf benötigt. Die ItemLookup-Methode der aws-Instanz führt den Webdienstaufruf aus und übergibt die Daten an Amazon.com. Die Methode gibt ein ItemLookupResponse-Objekt zurück. Da die Methode Ergebnisse für mehrere Elemente zurückgeben kann, entpackt der nächste Codeteil die erste Items-Auflistung und ruft dann das erste Item-Element in der Auflistung ab. In diesem Beispiel sollte nur eine Items-Auflistung vorhanden sein, die ein Item-Element enthält, da der Code nach der ISBN sucht – die für jedes Buch eindeutig ist. Der Code greift dann auf die ItemAttributes-Auflistung zu, um den Autor, das Veröffentlichungsdatum, den Herausgeber und den Titel in ihre jeweiligen Steuerelemente zu laden. Im letzten, aber wichtigen Schritt aktiviert der Code die btnPutInfoInDoc-Schaltfläche.

Da Fehler auftreten können, sollten Sie den Kerncode wie dargestellt in einem Try-Catch-Finally-Block einschließen. Der Code führt außerdem Aufrufe an die UpdateStatus-Methode durch, um den Benutzer über den Fortschritt der Suche auf dem Laufenden zu halten.

Visual Basic

Private Sub btnGetBookInfo_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles btnGetBookInfo.Click

Dim finalStatus As String = "Last Lookup Complete"
btnPutInfoInDoc.Enabled = False

If txtISBN.Text Is Nothing OrElse txtISBN.Text = String.Empty Then
MsgBox("Please enter a valid ISBN.", _
MsgBoxStyle.Exclamation, "Warning")
txtISBN.Focus()
Return
End If

Try
UpdateStatus("Preparing ...")

If aws Is Nothing Then
aws = New AmazonECS4.AWSECommerceService()
End If

' Define a specific item to look up.
Dim ilr As New AmazonECS4.ItemLookupRequest
ilr.ItemId = New String() {txtISBN.Text.Trim()}
ilr.IdType = AmazonECS4.ItemLookupRequestIdType.ASIN
ilr.IdTypeSpecified = True
ilr.ResponseGroup = New String() {"Medium"}

Dim il As New AmazonECS4.ItemLookup()
With il
.AWSAccessKeyId = AWS_Access_KeyId
.Request = New AmazonECS4.ItemLookupRequest() {ilr}
End With

UpdateStatus("Making Request ...")

' Make the request from the Web service.
Dim ilresp As AmazonECS4.ItemLookupResponse = aws.ItemLookup(il)
UpdateStatus("Processing Response ...")

' Unpack the results.
Dim resultsItems As AmazonECS4.Items = ilresp.Items(0)
Dim mainItem As AmazonECS4.Item = resultsItems.Item(0)

' Load the results into the UI.
With mainItem.ItemAttributes
savedISBN = .ISBN
lblAuthor.Text = .Author(0)
lblYearPublished.Text = CDate(.PublicationDate).Year.ToString()
lblPublisher.Text = .Publisher
lblTitle.Text = .Title
End With

btnPutInfoInDoc.Enabled = True

Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, ex.Source)
finalStatus = "Error on last request. Try again."

Finally
UpdateStatus(finalStatus)
End Try
End Sub

C#

void btnGetBookInfo_Click(object sender, EventArgs e)
{
  string finalStatus = "Last Lookup Complete"; 
  btnPutInfoInDoc.Enabled = false; 
  
  if (txtISBN.Text == null || txtISBN.Text == string.Empty) 
  { 
    MessageBox.Show("Please enter a valid ISBN.", "Warning", 
      MessageBoxButtons.OK, MessageBoxIcon.Warning );
    txtISBN.Focus(); 
    return; 
  }

  try 
  { 
    UpdateStatus("Preparing ..."); 
    if (aws == null) 
    { 
      aws = new AmazonECS4.AWSECommerceService(); 
    } 

    // Define a specific item to look up.
    AmazonECS4.ItemLookupRequest ilr = 
      new AmazonECS4.ItemLookupRequest(); 
    ilr.ItemId = new string[] {txtISBN.Text.Trim()}; 
    ilr.IdType = AmazonECS4.ItemLookupRequestIdType.ASIN; 
    ilr.IdTypeSpecified = true; 
    ilr.ResponseGroup = new string[] {"Medium"}; 

    AmazonECS4.ItemLookup il = new AmazonECS4.ItemLookup(); 
    il.AWSAccessKeyId = AWS_Access_KeyId; 
    il.Request = new AmazonECS4.ItemLookupRequest[]{ilr}; 

    UpdateStatus("Making Request ...");

    // Make the request from the Web service.
    AmazonECS4.ItemLookupResponse ilresp = aws.ItemLookup(il); 
    UpdateStatus("Processing Response ..."); 

    // Unpack the results.
    AmazonECS4.Items resultsItems = ilresp.Items[0]; 
    AmazonECS4.Item mainItem = resultsItems.Item[0];

    // Load the results into the UI.
    savedISBN = mainItem.ItemAttributes.ISBN; 
    lblAuthor.Text = mainItem.ItemAttributes.Author[0]; 
    lblYearPublished.Text = System.Convert.ToDateTime( 
      mainItem.ItemAttributes.PublicationDate).Year.ToString(); 
    lblPublisher.Text = mainItem.ItemAttributes.Publisher; 
    lblTitle.Text = mainItem.ItemAttributes.Title; 

    btnPutInfoInDoc.Enabled = true; 
  } 
  catch (Exception ex) 
  { 
    MessageBox.Show(ex.Message, ex.Source, 
      MessageBoxButtons.OK, MessageBoxIcon.Stop);
    finalStatus = "Error on last request. Try again."; 
  } 
  finally 
  { 
    UpdateStatus(finalStatus); 
  } 
}

Nachdem der Webdienstaufruf beendet wurde und die Daten in die Steuerelemente geladen wurden, aktiviert der Code die btnPutInfoInDoc-Schaltfläche. Der letzte Codeblock, den Sie hinzufügen müssen, ist der Click-Ereignishandlercode. Der Code erstellt ein Zeichenfolgenarray zum Speichern aller Steuerelementdaten und aktualisiert dann mithilfe von String.Format die citation-Zeichenfolge mit den Werten aus dem Array. Dann verwendet der Code die InsertAfter-Methode des Range-Objekts, um die Zitatangabe an der aktuellen Cursorposition einzufügen. Nachdem Sie diesen Code hinzugefügt haben, ist die Projektmappe vollständig und kann getestet werden.

Visual Basic

Private Sub btnPutInfoInDoc_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles btnPutInfoInDoc.Click

Dim data() As String = {lblTitle.Text, lblAuthor.Text, _
lblYearPublished.Text, lblPublisher.Text, _
savedISBN}
Dim citation As String = _
String.Format("{0} by {1}. Copyright {2} {3}, {4}", data)
Me.Range.InsertAfter(citation)
End Sub

C#

void btnPutInfoInDoc_Click(object sender, EventArgs e)
{
  string[] data = { lblTitle.Text, lblAuthor.Text, 
    lblYearPublished.Text, lblPublisher.Text, savedISBN };
  string citation = string.Format(
    "{0} by {1}. Copyright {2} {3}, {4}", data);
  object missingValue = System.Reflection.Missing.Value;
  this.Range(ref missingValue, ref missingValue).InsertAfter(citation);
}

Weiterentwicklung

Obwohl die Projektmappe in der beschriebenen Weise funktioniert, ist sie alles andere als perfekt. Vom Entwurfsstandpunkt aus verhindert die Speicherung des gesamten Codes in der ThisDocument-Klasse dessen Wiederverwendung. Darüber hinaus ist die Anordnung der Steuerelemente im Aufgabenbereich zwar funktional, aber nicht gerade ansprechend. Problematischer ist, dass Sie jedes Mal, wenn Sie den Aufgabenbereich für den Amazon-Webdienst verwenden möchten, dieses spezielle Dokument verwenden müssen. Seine Änderung in ein Word-Vorlagenprojekt würde in gewisser Weise helfen. Was jedoch wirklich gewünscht wird, ist ein Aufgabenbereich auf Anwendungsebene. Glücklicherweise werden Aufgabenbereiche auf Anwendungsebene von Word 2007 unterstützt. Im nächsten Abschnitt wird beschrieben, wie Sie die Projektmappe so erstellen können, dass sie als Aufgabenbereich auf Anwendungsebene ausgeführt wird. Außerdem können Sie den Entwurf umgestalten, damit Sie ihn leichter in einer anderen Hostanwendung verwenden können.

 

Entwurfsänderungen

Die Projektmappe ist recht einfach, kann jedoch auf mehrere Arten umgestaltet werden. Die Funktionalität kann in drei Hauptbereiche eingeteilt werden: Aufgabenbereichsintegration, Hostdokumentintegration und Webdienstcode. Der erste Schritt besteht in der Erstellung einer separaten Assembly und eines Windows Forms-Benutzersteuerelements zum Hosten der Steuerelemente der Benutzeroberfläche. Im nächsten Schritt wird eine Assembly erstellt, die den gesamten Webdienstcode enthält. Im letzten Schritt werden alle diese Elemente zusammengeführt: Das Benutzersteuerelement wird mit der Webdienstassembly verbunden, und anschließend wird die Benutzersteuerelement-Assembly durch ein Anwendungs-Add-In für Word 2007 in einen Aufgabenbereich auf Anwendungsebene geladen.

Erstellen des Benutzersteuerelements

Zum Erstellen des Benutzersteuerelements benötigen Sie ein neues Windows-Steuerelementbibliothek-Projekt. Bei dieser Version der Projektmappe erstellen Sie eine große Visual Studio-Projektmappe, in der alle Projekte definiert sind. Eine andere Option besteht darin, für jedes Element eine eigene Visual Studio-Projektmappe zu erstellen.

So erstellen Sie ein Benutzersteuerelement

  1. Zeigen Sie im Menü Datei auf Neu, und klicken Sie dann auf Projekt.

  2. Erweitern Sie im Dialogfeld Neues Projekt in der Liste der Projekttypen entweder den Knoten Visual Basic oder den Knoten Visual C#.

  3. Wählen Sie in der Liste der Projekttypen den Knoten Windows aus.

  4. Wählen Sie im Bereich Vorlagen die Option Windows-Steuerelementbibliothek aus.

  5. Nennen Sie das Projekt CitationsUC, geben Sie einen Speicherort für das Benutzersteuerelement an, nennen Sie die Projektmappe CitationsSolution, wählen Sie Projektmappenverzeichnis erstellen, und klicken Sie dann auf OK.

  6. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf UserControl.vb oder UserControl.cs, und klicken Sie dann auf Umbenennen.

  7. Ändern Sie den Namen in Citation.vb oder Citation.cs.

Vorhin haben Sie dem Aufgabenbereich die Windows Forms-Steuerelemente programmgesteuert hinzugefügt. Sie können ein Benutzersteuerelement jedoch entweder durch Schreiben von Code oder visuell mit dem Designer erstellen. Sie haben die Wahl. Denken Sie aber daran, dass Sie fünf Label-Steuerelemente, ein Textfeld und zwei Schaltflächen hinzufügen müssen. Wie Sie diese Steuerelemente anordnen, bleibt Ihnen überlassen. Abbildung 2 zeigt ein Beispiellayout.

Abbildung 2: Benutzersteuerelement „Citation“
Abbildung 2: Benutzersteuerelement „Citation“

Nachdem Sie die Steuerelemente hinzugefügt und angeordnet haben, müssen Sie zunächst die Webdienstassembly erstellen, bevor Sie Code in das Benutzersteuerelement schreiben.

Wrappen des Webdienstcodes

Nachdem Sie das Benutzersteuerelement erstellt haben, besteht der nächste Schritt in der Erstellung einer Assembly, die den gesamten Webdienstcode enthält.

So erstellen Sie die Webdienstassembly

  1. Öffnen Sie die Projektmappe, die Sie im ersten Schritt erstellt haben.

  2. Zeigen Sie im Menü Datei auf Hinzufügen, und klicken Sie dann auf Neues Projekt.

  3. Erweitern Sie im Dialogfeld Neues Projekt hinzufügen in der Liste der Projekttypen entweder den Knoten Visual Basic oder den Knoten Visual C#.

  4. Wählen Sie in der Liste der Projekttypen den Knoten Windows aus.

  5. Wählen Sie im Bereich Vorlagen die Option Klassenbibliothek aus.

  6. Geben Sie den Namen CitationWS ein, und klicken Sie dann auf OK.

  7. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf Class1.vb oder Class1.cs, und klicken Sie dann auf Umbenennen.

  8. Ändern Sie den Namen in Amazon.vb oder Amazon.cs.

  9. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektknoten CitationWS, und klicken Sie dann auf Webverweis hinzufügen.

  10. Geben Sie im Dialogfeld Webverweis hinzufügen im Feld URL die folgende Adresse ein, und klicken Sie dann auf Gehe zu: http://webservices.amazon.com/AWSECommerceService/2006-05-17/AWSECommerceService.wsdl

  11. Wenn die Webdienstbeschreibung angezeigt wird, geben Sie im Feld Webverweisname den Namen AmazonECS4 ein. Klicken Sie dann auf Verweis hinzufügen, um den Vorgang abzuschließen und die lokale Proxyklasse zu generieren.

Nachdem Sie das Klassenbibliotheksprojekt eingerichtet haben, ersetzen Sie nun die leere Amazon-Klassendatei durch den nachstehend aufgeführten Code. Der Kerncode ist mit dem Code identisch, der im Click-Ereignishandler der btnGetBookInfo-Schaltfläche der Word 2003-Projektmappe verwendet wird. Es gibt jedoch Änderungen:

  • Für die Klasse ist ein neues Status-Ereignis definiert. Der Code löst dieses Ereignis aus, um der Benutzeroberfläche die Möglichkeit zu geben, dem Benutzer auf Wunsch Fortschrittsinformationen zur Verfügung zu stellen. Im vorherigen Beispiel wurde durch den Code ein Label-Steuerelement direkt aktualisiert.

  • Weil der Code die Steuerelemente nicht direkt aktualisieren kann, wird eine Methode benötigt, mit der die Ergebnisdaten an den Aufrufer übergeben werden können. Sie können dies auf unterschiedliche Weise erreichen. In diesem Beispiel wird im Code eine verschachtelte Klasse namens BookData verwendet. Die BookData-Klasse ist der Rückgabewert für eine neue Methode, GetBookInfo, die als Eingabe eine ISBN in Form einer Zeichenfolge akzeptiert. Bei dieser Methode erstellt der Code eine lokale Instanz von BookData, speichert die ISBN in der Instanz und richtet dann den Webdienstaufruf genau wie in dem Word 2003-Beispiel ein. Wenn der Webdienstaufruf beendet ist, speichert der Code – da er keinen Zugriff auf die Benutzeroberfläche hat – die Rückgabedaten in den Feldern der BookData-Instanz, statt die Benutzeroberfläche direkt zu aktualisieren.

  • Der Code löst Ausnahmen an den Stellen aus, an denen in der Word 2003-Projektmappe Aufrufe zum Anzeigen eines Meldungsfelds verwendet wurden.

  • Statt die Ausnahmen abzufangen, gestattet es der Code zur Laufzeit, Ausnahmen für den Aufrufer erneut auszulösen.

Visual Basic

Public Class Amazon
Public Event Status(ByVal Message As String)

Private Const AWS_Access_KeyId As String = "<i>Your Access Key ID</i>"
Private aws As AmazonECS4.AWSECommerceService = Nothing

' Nested class used to return search results.
Public Class BookData
Public ISBN As String
Public Author As String
Public Publisher As String
Public Title As String
Public YearPublished As String
End Class

Public Function GetBookInfo(ByVal ISBN As String) As BookData
If ISBN Is Nothing OrElse ISBN = String.Empty Then
Throw New Exception("Please provide a valid ISBN.")
Else
RaiseEvent Status("Preparing ...")

If aws Is Nothing Then
aws = New AmazonECS4.AWSECommerceService()
End If

' Create an instance of the return value.
Dim localBookData As New BookData
localBookData.ISBN = ISBN.Trim()

' Define a specific item to look up.
Dim ilr As New AmazonECS4.ItemLookupRequest
ilr.ItemId = New String() {localBookData.ISBN}
ilr.IdType = AmazonECS4.ItemLookupRequestIdType.ASIN
ilr.IdTypeSpecified = True
ilr.ResponseGroup = New String() {"Medium"}

Dim il As New AmazonECS4.ItemLookup()
With il
.AWSAccessKeyId = AWS_Access_KeyId
.Request = New AmazonECS4.ItemLookupRequest() {ilr}
End With

RaiseEvent Status("Making Request ...")
' Make the request from the Web service.
Dim ilresp As AmazonECS4.ItemLookupResponse = aws.ItemLookup(il)
RaiseEvent Status("Processing Response ...")

Dim resultsItems As AmazonECS4.Items = ilresp.Items(0)
Dim mainItem As AmazonECS4.Item = resultsItems.Item(0)
With mainItem.ItemAttributes
localBookData.Author = .Author(0)
localBookData.YearPublished = _
CDate(.PublicationDate).Year.ToString()
localBookData.Publisher = .Publisher
localBookData.Title = .Title
End With

RaiseEvent Status("Last Lookup Complete")

Return localBookData
End If
End Function
End Class

C#

public class Amazon
{
public delegate void StatusEventHandler(string Message);
public event StatusEventHandler Status;

private const string AWS_Access_KeyId = "<i>Your Access Key ID</i>";
private AmazonECS4.AWSECommerceService aws = null;

// Nested class used to return search results.
public class BookData
{
public string ISBN;
public string Author;
public string Publisher;
public string Title;
public string YearPublished;
}

public BookData GetBookInfo(string ISBN)
{
if (ISBN == null || ISBN == string.Empty)
{
throw new Exception("Please provide a valid ISBN.");
}
else
{
if (Status != null)
{
Status("Preparing ...");
}
if (aws == null)
{
aws = new AmazonECS4.AWSECommerceService();
}

// Create an instance of the return value.
BookData localBookData = new BookData();
localBookData.ISBN = ISBN.Trim();

// Define a specific item to look up.
AmazonECS4.ItemLookupRequest ilr =
new AmazonECS4.ItemLookupRequest();
ilr.ItemId = new string[] { localBookData.ISBN };
ilr.IdType = AmazonECS4.ItemLookupRequestIdType.ASIN;
ilr.IdTypeSpecified = true;
ilr.ResponseGroup = new string[] { "Medium" };

AmazonECS4.ItemLookup il = new AmazonECS4.ItemLookup();
il.AWSAccessKeyId = AWS_Access_KeyId;
il.Request = new AmazonECS4.ItemLookupRequest[] { ilr };

// Make the request from the Web service.
if (Status != null)
{
Status("Making Request ...");
}
AmazonECS4.ItemLookupResponse ilresp = aws.ItemLookup(il);
if (Status != null)
{
Status("Processing Response ...");
}

AmazonECS4.Items resultsItems = ilresp.Items[0];
AmazonECS4.Item mainItem = resultsItems.Item[0];
localBookData.Author = mainItem.ItemAttributes.Author[0];
localBookData.YearPublished =
System.Convert.ToDateTime(
mainItem.ItemAttributes.PublicationDate).Year.ToString();
localBookData.Publisher = mainItem.ItemAttributes.Publisher;
localBookData.Title = mainItem.ItemAttributes.Title;
if (Status != null)
{
Status("Last Lookup Complete");
}
return localBookData;
}
}
}

Dieser neue Entwurf ermöglicht es Ihnen, den Webdienst unabhängig vom Typ der Hostinganwendung wiederzuverwenden. Wenn gewünscht, wäre jetzt ein guter Zeitpunkt für die Kompilierung. Wenn keine Fehler auftreten, fahren Sie mit dem nächsten Abschnitt fort.

Verbinden aller Elemente

Wie erwähnt bietet Visual Studio 2005 Tools for Office Second Edition als neues Feature so genannte „verwaltete Anwendungs-Add-Ins“: Damit führen Sie alle Elemente mithilfe eines Add-In-Projekts für Word 2007 zusammen!

So verbinden Sie die Projekte

  1. Zeigen Sie im Menü Datei auf Hinzufügen, und klicken Sie dann auf Neues Projekt.

  2. Erweitern Sie im Dialogfeld Neues Projekt hinzufügen in der Liste der Projekttypen entweder den Knoten Visual Basic oder den Knoten Visual C#.

  3. Erweitern Sie den Knoten Office, und wählen Sie dann den Knoten 2007-Add-Ins aus.

  4. Wählen Sie im Bereich Vorlagen die Option Word-Add-In aus.

  5. Geben Sie den Namen CitationsAddinWord ein, und klicken Sie dann auf OK.

  6. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektknoten „CitationsAddinWord“, und klicken Sie dann auf Verweis hinzufügen.

  7. Klicken Sie auf die Registerkarte Projekte, wählen Sie das Projekt „CitationsUC“ aus, und klicken Sie dann auf OK.

  8. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektknoten „CitationsUC“, und klicken Sie dann auf Verweis hinzufügen.

  9. Klicken Sie auf die Registerkarte Projekte, wählen Sie das Projekt „CitationsUC“ aus, und klicken Sie dann auf OK.

  10. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektknoten „CitationsAddinWord“, und klicken Sie dann auf Als Startprojekt festlegen.

Die 2007 Office System-Anwendungen, die Unterstützung für Aufgabenbereiche auf Anwendungsebene bieten, unterstützen mehrere aktive Aufgabenbereiche gleichzeitig. Daher unterscheidet sich der Code zum Erstellen eines Aufgabenbereichs auf Anwendungsebene ein wenig von dem Code zum Erstellen von Dokumentenaktionen-Aufgabenbereichen. Der folgende Code zeigt, wie das zu einem früheren Zeitpunkt erstellte Benutzersteuerelement einem Aufgabenbereich auf Anwendungsebene hinzugefügt wird:

Visual Basic

Imports Microsoft.Office.Tools

Public Class ThisAddIn
Private WithEvents citationsUI As CitationsUC.Citation
Private citationTaskPane As CustomTaskPane

Private Sub ThisAddIn_Startup(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Startup

citationsUI = New CitationsUC.Citation
citationTaskPane = CustomTaskPanes.Add( _
citationsUI, "Citations")

citationTaskPane.Visible = True
End Sub

Private Sub ThisAddIn_Shutdown(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Shutdown

CustomTaskPanes.Remove(citationTaskPane)
End Sub
End Class

C#

using Microsoft.Office.Tools;

namespace CitationsAddinWordCS
{
public partial class ThisAddIn
{
private CitationsUC.Citation citationsUI;
private CustomTaskPane citationTaskPane;

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
citationsUI = new CitationsUC.Citation();
citationTaskPane = CustomTaskPanes.Add(citationsUI, "Citations");

citationTaskPane.Visible = true;
}

private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
{
CustomTaskPanes.Remove(citationTaskPane);
}
}
}

Hierbei sind einige Punkte zu beachten:

  • Es ist eine Auflistung benutzerdefinierter Aufgabenbereiche vorhanden. Eine Hostanwendung kann mehrere Aufgabenbereiche gleichzeitig anzeigen.

  • Sie müssen den Aufgabenbereich sichtbar machen. Diesen Schritt sollten Sie jedoch erst während der Testphase durchführen. In 2007 Office System sollten Elemente der Benutzeroberfläche, wie Aufgabenbereiche, nie einfach „aus dem Nichts“ erscheinen. Die empfohlene Vorgehensweise besteht darin, der Multifunktionsleiste ein Benutzeroberflächenelement hinzuzufügen, damit der Benutzer den Aufgabenbereich Citations einblenden kann.

  • Da der benutzerdefinierte Aufgabenbereich nicht mehr einem bestimmten Dokument zugeordnet ist, muss er entfernt werden, wenn das Add-In entladen wird. Wenn der Host entladen wird, ist dies natürlich kein großes Problem. Der Benutzer könnte das Add-In jedoch jederzeit entladen, und Ihre Benutzeroberflächenelemente sollten dann nicht zurückbleiben.

Sie haben den Code zum Laden des Benutzersteuerelements geschrieben. Jetzt können Sie den Code schreiben, durch den die Buchdaten vom Webdienst in das Benutzersteuerelement geladen werden. Danach ist der nächste Codeteil, den Sie schreiben müssen, der Code zum Laden von Buchdaten im aktiven Dokument. Im Anschluss daran arbeiten Sie an der Einbindung Ihres Add-Ins in die Multifunktionsleiste, um ihm den letzten Schliff zu geben.

Für die Verbindung des Benutzersteuerelements mit dem Webdienst ist nur wenig Code erforderlich. Sie haben bereits den Verweis auf die Webdienstassembly eingerichtet. Sie müssen nun noch zwei Klassenvariablen definieren: eine für den Webdienst und die andere für die vom Benutzer eingegebene ISBN. Zudem müssen Sie zwei Ereignishandler definieren: einen für das Click-Ereignis des btnGetBookInfo-Objekts und einen für das Status-Ereignis der Amazon-Klasse. Die folgende Auflistung zeigt die Citation-Klasse:

Visual Basic

Public Class Citation
Private WithEvents amznWS As CitationsWS.Amazon
Private savedISBN As String

Private Sub btnGetBookInfo_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnGetBookInfo.Click

If amznWS Is Nothing Then
amznWS = New CitationsWS.Amazon
End If

Dim bookInfo As CitationsWS.Amazon.BookData = Nothing
Try
bookInfo = amznWS.GetBookInfo(txtISBN.Text)

Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, ex.Source)
lblGetBookInfoStatus.Text = "Error on last request. Try again"
Return
End Try

If bookInfo IsNot Nothing Then
With bookInfo
savedISBN = .ISBN
lblAuthor.Text = .Author
lblPublisher.Text = .Publisher
lblTitle.Text = .Title
lblYearPublished.Text = .YearPublished
End With
lblGetBookInfoStatus.Text = "Ready"
End If
End Sub

Private Sub amznWS_Status(ByVal Message As String) Handles amznWS.Status
lblGetBookInfoStatus.Text = Message
lblGetBookInfoStatus.Refresh()
End Sub
End Class

C#

public partial class Citation : UserControl
{

private CitationsWS.Amazon amznWS;
private string savedISBN;

public Citation()
{
InitializeComponent();
}

private void btnGetBookInfo_Click(object sender, EventArgs e)
{
if ((amznWS == null))
{
amznWS = new CitationsWS.Amazon();
amznWS.Status +=
new CitationsWS.Amazon.StatusEventHandler(amznWS_Status);
}

CitationsWS.Amazon.BookData bookInfo = null;
try
{
bookInfo = amznWS.GetBookInfo(txtISBN.Text);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source,
MessageBoxButtons.OK, MessageBoxIcon.Stop);
lblGetBookInfoStatus.Text = "Error on last request. Try again";
return;
}

if (bookInfo != null)
{
savedISBN = bookInfo.ISBN;
lblAuthor.Text = bookInfo.Author;
lblPublisher.Text = bookInfo.Publisher;
lblTitle.Text = bookInfo.Title;
lblYearPublished.Text = bookInfo.YearPublished;
lblGetBookInfoStatus.Text = "Ready";
}
}

void amznWS_Status(string Message)
{
lblGetBookInfoStatus.Text = Message;
lblGetBookInfoStatus.Refresh();
}
}

Das Einbinden der Literaturangaben in Word 2007 erfordert etwas mehr Arbeit als bei Word 2003. Da Sie den Entwurf angepasst haben, sollte das Benutzersteuerelement tatsächlich keine Abhängigkeit von der Ausführung in Word oder einer anderen Office-Anwendung aufweisen. Eine Möglichkeit hierfür besteht darin, die Daten aus den Labels als Eigenschaften des Steuerelements verfügbar zu machen. Außerdem müssen Sie ein Ereignis definieren, damit jeder Host, der das Benutzersteuerelement verwendet, das Klicken des Benutzers auf die btnPutInfoInDoc-Schaltfläche erkennt.

HinweisHinweis:
Sie könnten die Schaltfläche verfügbar machen, indem Sie ihren Sichtbarkeitsstatus von Friend oder internal in Public ändern. Dadurch würde jedoch das gesamte Steuerelement verfügbar gemacht und die Kapselung zerstört.

Wrappen Sie zuerst die Text-Eigenschaft aller relevanten Label-Steuerelemente, damit die Hostanwendung auf diese Daten zugreifen kann. Definieren Sie als Nächstes ein Ereignis, das dem Host-Add-In signalisiert, dass der Benutzer die Daten aus dem Benutzersteuerelement in das aktive Dokument übertragen möchte. Schreiben Sie abschließend Code, der das Ereignis im Click-Ereignishandler der btnPutInfoInDoc-Schaltfläche auslöst. Der folgende Code zeigt diese Änderungen in der Citation-Klasse:

Visual Basic

Public Class Citation
Private WithEvents amznWS As CitationsWS.Amazon
Private savedISBN As String
Public Event PutInfo As System.EventHandler

Private Sub btnPutInfoInDoc_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnPutInfoInDoc.Click

RaiseEvent PutInfo(Me, EventArgs.Empty)
End Sub

Public ReadOnly Property Author() As String
Get
Return lblAuthor.Text
End Get
End Property
Public ReadOnly Property ISBN() As String
Get
Return savedISBN
End Get
End Property
Public ReadOnly Property Publisher() As String
Get
Return lblPublisher.Text
End Get
End Property
Public ReadOnly Property Title() As String
Get
Return lblTitle.Text
End Get
End Property
Public ReadOnly Property YearPublished() As String
Get
Return lblYearPublished.Text
End Get
End Property
End Class

C#

public partial class Citation : UserControl
{
private CitationsWSCS.Amazon amznWS;
private string savedISBN;
public event System.EventHandler PutInfo;

private void btnPutInfoInDoc_Click(object sender, EventArgs e)
{
PutInfo(this, EventArgs.Empty);
}

public string Author
{
get { return lblAuthor.Text; }
}
public string ISBN
{
get { return savedISBN; }
}
public string Publisher
{
get { return lblPublisher.Text; }
}
public string Title
{
get { return lblTitle.Text; }
}
public string YearPublished
{
get { return lblYearPublished.Text; }
}
}

Fügen Sie als Nächstes der ThisAddIn-Klasse einen Ereignishandler hinzu, der das PutInfo-Ereignis abfängt und die Literaturangaben in das aktive Word-Dokument lädt. Rufen Sie im Ereignishandler die Daten aus dem Benutzersteuerelement ab und fügen Sie sie in ein Zeichenfolgenarray ein. Übergeben Sie dann das Array an die String.Format-Methode, die die Zeichenfolge mit der Literaturangabe erstellt. Fügen Sie anschließend die Literaturangabe genau wie bei der Word 2003-Projektmappe in das aktive Dokument ein.

Visual Basic

Public Class ThisAddIn
Private Sub citationsUI_PutInfo(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles citationsUI.PutInfo

Dim data(4) As String
With citationsUI
data(0) = .Title
data(1) = .Author
data(2) = .YearPublished
data(3) = .Publisher
data(4) = .ISBN
End With

Dim citation As String = _
String.Format("{0} by {1}. Copyright {2} {3}, {4}", Data)

Me.Application.ActiveDocument.Range.InsertAfter(citation)
End Sub
End Class

C#

public partial class ThisAddIn
{
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
citationsUI = new CitationsUCCS.Citation();
citationTaskPane = CustomTaskPanes.Add(citationsUI, "Citations");
citationsUI.PutInfo += new EventHandler(citationsUI_PutInfo);
citationTaskPane.Visible = true;
}

void citationsUI_PutInfo(object sender, EventArgs e)
{
string[] data = new string[5];
data[0] = citationsUI.Title;
data[1] = citationsUI.Author;
data[2] = citationsUI.YearPublished;
data[3] = citationsUI.Publisher;
data[4] = citationsUI.ISBN;
string citation =
string.Format("{0} by {1}. Copyright {2} {3}, {4}", data);
object missingValue = System.Reflection.Missing.Value;
this.Application.ActiveDocument.Range(
ref missingValue, ref missingValue).InsertAfter(citation);
}
}

Starten Sie die Projektmappe und prüfen Sie, ob alles funktioniert. Das Ergebnis ist das gleiche wie zuvor. Sie verfügen jedoch jetzt über ein verfeinertes und viel professionelleres Design, das die Wiederverwendung der Komponenten in anderen Office-Hostanwendungen oder sogar in anderen verwalteten Anwendungen enorm erleichtert. Sie sind jedoch noch immer nicht fertig.

Hinzufügen von Multifunktionsleisten-Support

Momentan blendet das Add-In den Aufgabenbereich Citations beim Start ein. Dies funktioniert solange, bis der Benutzer den Aufgabenbereich schließt. Wie kann der Benutzer den Aufgabenbereich wieder anzeigen? Dieses Verhalten steht auch zu den vom Office-Team bereitgestellten Entwurfsstandards im Widerspruch. Sie müssen der Multifunktionsleiste eine bestimmte Art Schaltfläche hinzufügen, damit der Benutzer die Sichtbarkeit des Aufgabenbereichs steuern kann.

Befolgen Sie zum Hinzufügen von Multifunktionsleisten-Support die folgenden grundlegenden Schritte:

  1. Fügen Sie einer vorhandenen Multifunktionsleisten-Registerkarte eine Umschaltfläche hinzu (hierfür bietet sich die Registerkarte Einfügen an).

  2. Fügen Sie einen „Rückruf“ hinzu, der aufgerufen wird, wenn der Benutzer auf die Schaltfläche klickt.

  3. Ändern Sie den Sichtbarkeitsstatus des Aufgabenbereichs, wenn der Rückruf stattfindet.

  4. Stellen Sie sicher, dass die Schaltfläche den richtigen Status des Aufgabenbereichs aufruft, wenn der Benutzer diesen über den Aufgabenbereich statt über die Schaltfläche schließt.

Visual Studio 2005 Tools for Office Second Edition bietet Unterstützung für die Programmierung der Multifunktionsleiste, im amerikanischen Original als „Ribbon“ bezeichnet.

So erweitern Sie Ihr um Projekt Multifunktionsleisten-Support

  1. Wählen Sie im Projektmappen-Explorer das Add-In-Projekt für Word aus.

  2. Klicken Sie im Menü Projekt auf Neues Element hinzufügen.

  3. Wählen Sie im Dialogfeld Neues Element hinzufügen die Option Ribbon support (Multifunktionsleisten-Support).

  4. Ändern Sie den Dateinamen in RibbonCode.vb oder RibbonCode.cs, und klicken Sie dann auf Hinzufügen.

Das Projekt erhält nun zwei neue Elemente: eine RibbonCode-Quelldatei und die Datei RibbonCode.xml, die auf die Kompilierung als eingebettete Ressource eingestellt ist. Sie müssen die XML-Datei aktualisieren, damit die neue Umschaltfläche ordnungsgemäß auf der Registerkarte Einfügen angezeigt wird.

Öffnen Sie hierzu RibbonCode.xml, und ersetzen Sie den Standard-XML-Code durch den folgenden XML-Code:

Xml

<customUI xmlns="https://schemas.microsoft.com/office/2006/01/customui" 
          onLoad="OnLoad">
<ribbon>
<tabs>
<tab idMso="TabInsert">
<group id="amznCitation"
               label="Citation">
<toggleButton id="showCitationActionPane" 
                        size="large"
                        label="Citation from WS"
                        screentip="Insert a citation from Amazon"
                        onAction="showCitationActionPane_onAction" 
                        imageMso="CitationInsert" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>

Der XML-Code weist die Multifunktionsleiste an, der Registerkarte Einfügen eine neue Gruppe hinzuzufügen. Außerdem deklariert der XML-Code, dass es sich bei der Schaltfläche um eine große Umschaltfläche mit einer Bezeichnung und QuickInfo handeln soll. Für diese soll ein integriertes Bild verwendet werden, und sie soll eine Methode namens showCitationActionPane_onAction aufrufen, wenn der Benutzer auf die Schaltfläche klickt.

Jetzt können Sie die Klasse ändern, die den Code für Multifunktionsleisten-Support enthält. Kommentieren Sie den Codeabschnitt unter den Imports- oder using-Anweisungen aus. Dieser Code teilt der Office-Hostanwendung mit, dass Ihr Add-In benutzerdefinierte Handler für die Multifunktionsleiste bereitstellen möchte. Der Code implementiert dies in Form von zwei Klassen. Der erste Codeabschnitt ist eine partielle Klasse, die mit Ihrer Add-In-Klasse verknüpft ist. Die zweite Klasse, RibbonCode, stellt die Rückrufpunkte bereit, die benötigt werden, um der Multifunktionsleiste auf Anforderung den XML-Code zur Verfügung zu stellen und Multifunktionsleisten-Ereignisse zu verarbeiten. Nachdem Sie den Code auskommentiert haben, ändern Sie den Namen der Standardrückrufmethode von OnToggleButton1 in showCitationActionPane_onAction. Die Methode befindet sich innerhalb eines Bereichs mit der Bezeichnung Ribbon Callbacks (Multifunktionsleisten-Rückrufe). Nach Abschluss dieses Vorgangs können Sie Ihre Änderungen testen und prüfen, ob die Umschaltfläche ordnungsgemäß auf der Registerkarte Einfügen angezeigt wird. Wenn Sie auf die Schaltfläche klicken, müssen zudem Meldungsfelder angezeigt werden, die Sie über den Status der Umschaltfläche informieren.

Da die Kerninfrastruktur nun vorhanden ist, können Sie den erforderlichen Code hinzufügen, um den Sichtbarkeitsstatus des Aufgabenbereichs in Abhängigkeit vom Status der Umschaltfläche zu ändern. Das Problem besteht hierbei darin, dass der Code für die Verarbeitung des Rückrufs sich in einer anderen Klasse als die Add-In-Klasse befindet, die den Verweis auf den Aufgabenbereich enthält. Um den Rückruf verarbeiten zu können, benötigt die RibbonCode-Klasse also einen Verweis auf die Add-In-Klasse. Eine einfache Methode hierfür besteht darin, die RibbonCode-Klasse so zu ändern, dass sie über einen Konstruktor verfügt, der einen Verweis auf die Add-In-Klasse entgegennimmt. Verwenden Sie den folgenden Code als Beispiel:

Visual Basic

Public Sub New(ByVal Parent As ThisAddIn)
parentAddIn = Parent
End Sub

C#

public RibbonCode(ThisAddIn Parent)
{
  parentAddIn = Parent;
}

Fügen Sie eine Klassenvariable namens m_Parent hinzu, die zum Typ ThisAddin gehört. Dann müssen Sie die RequestService-Methode, die eine Instanz der RibbonCode-Klasse erstellt, auskommentieren und so ändern, dass sie diesen neuen Konstruktor verwendet. Der folgende Code zeigt die Änderungen, die Sie vornehmen müssen:

Visual Basic

Protected Overrides Function RequestService( _
ByVal serviceGuid As Guid) As Object

If serviceGuid = GetType(Office.IRibbonExtensibility).GUID Then
If ribbon Is Nothing Then
ribbon = New RibbonCode(Me)
End If
Return ribbon
End If

Return MyBase.RequestService(serviceGuid)
End Function

C#

protected override object RequestService(Guid serviceGuid)
{
  if (serviceGuid == typeof(Office.IRibbonExtensibility).GUID)
  {
    if (ribbon == null)
      ribbon = new RibbonCode(this);
    return ribbon;
  }

  return base.RequestService(serviceGuid);
}

Jetzt können Sie die OnAction-Rückrufmethode der Umschaltfläche ändern, um den Sichtbarkeitsstatus des Aufgabenbereichs zu ändern. Ersetzen Sie die vorhandene showCitationActionPane_onAction-Prozedur durch den folgenden Code:

Visual Basic

Public Sub showCitationActionPane_onAction( _
ByVal control As Office.IRibbonControl, _
ByVal isPressed As Boolean)

Me.parentAddIn.citationTaskPane.Visible = isPressed
End Sub

C#

public void showCitationActionPane_onAction(
  Office.IRibbonControl control, bool isPressed)
{
  this.parentAddIn.citationTaskPane.Visible = isPressed;
}

Damit dieser Code funktioniert, müssen Sie jedoch den Sichtbarkeitsstatus des Aufgabenbereichs in der ThisAddin-Klasse ändern. Öffnen Sie die ThisAddin-Klassendatei und ändern Sie den Sichtbarkeitsstatus der citationTaskPane-Variablen von private in Friend (wenn Sie Visual Basic verwenden) oder internal (wenn Sie Visual C# verwenden). Sie müssen zudem die Codezeile aus der ThisAddIn_Startup-Prozedur entfernen, die den Aufgabenbereich standardmäßig sichtbar macht. Nachdem Sie diese beiden Schritte durchgeführt haben, nehmen Sie einen Test vor: Wenn Sie auf die Schaltfläche klicken, muss sich die Sichtbarkeit des Aufgabenbereichs ändern.

Jetzt sind Sie fast fertig. Ein Problem muss noch gelöst werden: Wenn ein Benutzer den Aufgabenbereich anzeigt und dann auf das „X“ in der oberen Ecke des Aufgabenbereichs klickt, um diesen zu schließen, wird der Status der Umschaltfläche nicht geändert. Zur Behebung dieses Problems müssen Sie Code hinzufügen, um den aktuellen Status der Umschaltfläche zu bestimmen. Hierzu sind drei Änderungen erforderlich: Fügen Sie zuerst der RibbonCode-Klasse eine Rückrufprozedur hinzu, die von der Multifunktionsleiste verwendet wird, um den Status der Umschaltfläche abzufragen. Fügen Sie der RibbonCode-Klasse den folgenden Code hinzu:

Visual Basic

Public Function showCitationActionPane_getPressed( _
ByVal control As Office.IRibbonControl) As Boolean

Return Me.parentAddIn.citationTaskPane.Visible
End Function

C#

public bool showCitationActionPane_getPressed(
  Office.IRibbonControl control)
{
  return this.parentAddIn.citationTaskPane.Visible;
}

Fügen Sie dann der Multifunktionsleiste die neue Rückrufprozedur hinzu. Hierzu fügen Sie dem vorhandenen XML-Code ein zusätzliches Attribut hinzu. Orientieren Sie sich am folgenden XML-Code:

Xml

<customUI xmlns="https://schemas.microsoft.com/office/2006/01/customui" 
          onLoad="OnLoad">
<ribbon>
<tabs>
<tab idMso="TabInsert">
<group id="amznCitation"
               label="Citation">
<toggleButton id="showCitationActionPane" 
                        size="large"
                        label="Citation from WS"
                        screentip="Insert a citation from Amazon"
                        onAction="showCitationActionPane_onAction" 
                        getPressed="showCitationActionPane_getPressed"
                         imageMso="CitationInsert" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>

Fügen Sie abschließend Code hinzu, der die Multifunktionsleiste anweist, ihren Status zu überprüfen. Stellen Sie hierzu einen Ereignishandler für das VisibleChanged-Ereignis des Aufgabenbereichs bereit. In diesem Ereignishandler muss der Code die Umschaltfläche ungültig machen, was wiederum dazu führt, dass die Multifunktionsleiste die zuvor hinzugefügte Rückrufprozedur aufruft.

Fügen Sie zuerst der RibbonCode-Klasse den folgenden Ereignishandler hinzu:

Visual Basic

Public Sub OnVisibleChanged( _
ByVal sender As Object, ByVal e As EventArgs)

Me.ribbon.InvalidateControl("showCitationActionPane")
End Su

C#

public void OnVisibleChanged(object sender, EventArgs e)
{
  this.ribbon.InvalidateControl("showCitationActionPane");
}

Dieser Code bewirkt, dass die Umschaltfläche durch Übergabe ihrer ID an die InvalidateControl-Methode inaktiv wird. Ändern Sie als Nächstes die ThisAddIn_Startup-Prozedur, um diesen neu hinzugefügten Ereignishandler einzubinden.

Visual Basic

Private Sub ThisAddIn_Startup(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Startup
citationsUI = New CitationsUC.Citation
citationTaskPane = CustomTaskPanes.Add( _
citationsUI, "Citations")

AddHandler citationTaskPane.VisibleChanged, _
AddressOf ribbon.OnVisibleChanged
End Sub

C#

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
  citationsUI = new CitationsUCCS.Citation();
  citationTaskPane = CustomTaskPanes.Add(citationsUI, "Citations");
  citationsUI.PutInfo += new EventHandler(citationsUI_PutInfo);
  citationTaskPane.VisibleChanged += 
    new EventHandler(ribbon.OnVisibleChanged);
}

Wenn der Host jetzt den Multifunktionsleisten-Supportcode lädt, ruft die Klasse einen Hook für das VisibleChanged-Ereignis auf. Wenn der Benutzer den Aufgabenbereich schließt, wird das VisibleChanged-Ereignis ausgelöst, wodurch der Code die Umschaltfläche inaktiv schaltet. Dies führt dazu, dass die Multifunktionsleiste die showCitationActionPane_getPressed-Prozedur aufruft, um ihren aktuellen Status abzurufen. Testen Sie, ob Ihre Änderungen funktionieren!

Weitere Verbesserungsmöglichkeiten

Das Add-In funktioniert jetzt auch in Verbindung mit der Multifunktionsleiste. Die Projektmappe ist jedoch nicht wie die übrigen Add-Ins angepasst: Die Multifunktionsleiste ist mit einer bestimmten Hostanwendung verknüpft. Dadurch können Sie den Multifunktionsleistencode nicht in einer anderen Hostanwendung wiederverwenden, ohne Änderungen an der Implementierung vornehmen zu müssen. Zur Lösung dieses Problems müssen Sie den Multifunktionsleistencode und den XML-Code in eine separate Assembly verschieben. Der Multifunktionsleistencode muss mit jedem Host kommunizieren können, der den Aufgabenbereich Citations verwendet, ohne zu wissen, von welchem Add-In er gehostet wird. Hierzu definieren Sie eine Schnittstelle, die vom Add-In in der RibbonCode-Quelldatei implementiert werden kann.

Visual Basic

' Add to the top of the source file with the other Imports statements.
Imports Microsoft.Office.Tools

Public Interface ICitationParent
ReadOnly Property CitationTaskPane() As CustomTaskPane
End Interface

C#

//  Add to the top of the source file with the other using statements.
using Microsoft.Office.Tools;

namespace CitationsAddinWordCS
{
public interface ICitationParent
{
CustomTaskPane CitationTaskPane
{ get; }
}
}

Die ThisAddin-Klasse muss diese Schnittstelle implementieren. Außerdem müssen Sie den Code entfernen, den Sie der ThisAddIn_Startup-Prozedur hinzugefügt haben, die einen Hook für das VisibleChanged-Ereignis aufruft. Sie müssen zudem die Sichtbarkeitseinstellung von CustomTaskPane wieder in private ändern und den Namen ändern. Der folgende Code zeigt die relevanten Teile der aktualisierten Klasse:

Visual Basic

Public Class ThisAddIn
Implements ICitationParent

Private WithEvents citationsUI As CitationsUC.Citation
Private m_citationTaskPane As CustomTaskPane

Private Sub ThisAddIn_Startup(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Startup
citationsUI = New CitationsUC.Citation
m_citationTaskPane = CustomTaskPanes.Add( _
citationsUI, "Citations")
' AddHandler call removed.
End Sub

Private Sub ThisAddIn_Shutdown(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Shutdown

CustomTaskPanes.Remove(m_citationTaskPane)
End Sub

Public ReadOnly Property CitationTaskPane() As _
CustomTaskPane Implements ICitationParent.CitationTaskPane

Get
Return m_citationTaskPane
End Get
End Property
End Class

C#

public partial class ThisAddIn : ICitationParent
{
private CitationsUCCS.Citation citationsUI;
private CustomTaskPane m_citationTaskPane;

public CustomTaskPane CitationTaskPane
{
get { return m_citationTaskPane; }
}

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
citationsUI = new CitationsUCCS.Citation();
m_citationTaskPane = CustomTaskPanes.Add(citationsUI, "Citations");
citationsUI.PutInfo += new EventHandler(citationsUI_PutInfo);
//  Removed event handler for citationTaskPane.VisibleChanged.
}

private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
{
CustomTaskPanes.Remove(m_citationTaskPane);
}
}

Zusätzlich zu den Änderungen, die Sie gerade für die ThisAddin-Klasse durchgeführt haben, müssen Sie eine Reihe von Änderungen an der RibbonCode-Klasse und RequestService-Methode vornehmen. Die erste vorzunehmende Änderung besteht darin, den Typ der parentAddIn-Klassenvariable von ThisAddIn in ICitationParent zu ändern. Entfernen Sie dann den benutzerdefinierten Konstruktor, den Sie vorhin manuell hinzugefügt hatten.

Ein Problem beim Laden von Add-Ins in einen Office-Host besteht darin, dass Office den Multifunktionsleistencode verknüpft, bevor die Startup-Methode abgeschlossen ist. Dadurch wird verhindert, dass der Multifunktionsleistencode während der Erstellung einen Ereignishandler hinzufügt - ein Aufgabenbereich existiert noch nicht. Fügen Sie stattdessen eine Eigenschaft hinzu, die es dem Add-In ermöglicht, während der Startup-Methode den übergeordneten Multifunktionsleistencode zu konfigurieren. Da Sie den benutzerdefinierten Konstruktor entfernt haben, müssen Sie darüber hinaus die RequestService-Methode so anpassen, dass sie den Standardkonstruktor der RibbonCode-Klasse verwendet. Der nachfolgende Code zeigt die neue Eigenschaft, die Sie der RibbonCode-Klasse hinzufügen müssen. Die Set-Methode in dieser Eigenschaftenprozedur fügt den Ereignishandler für das VisibleChanged-Ereignis des Aufgabenbereichs hinzu.

HinweisHinweis:
Wenn Sie C# verwenden, müssen Sie in showCitationActionPane_onAction und showCitationActionPane_getPressed einen Kompilierungsfehler in Bezug auf die Großschreibung beim Objektnamen CitationTaskPane beheben. Er ist als citationTaskPane aufgelistet und muss CitationTaskPane lauten.

Visual Basic

Public Property Parent() As ICitationParent
Get
Return m_Parent
End Get
Set(ByVal value As ICitationParent)
parentAddIn = value
AddHandler parentAddIn.CitationTaskPane.VisibleChanged, _
AddressOf Me.OnVisibleChanged
End Set
End Property

C#

public ICitationParent Parent
{
  get { return m_Parent; }
  set 
  {
    parentAddIn = value;
    parentAddIn.CitationTaskPane.VisibleChanged += 
      new EventHandler(this.OnVisibleChanged);
  }
}

Fügen Sie abschließend die folgende Codezeile als letzte Zeile in der ThisAddIn_Startup-Prozedur hinzu:

Visual Basic

Me.ribbon.Parent = Me

C#

this.ribbon.Parent = this;

Sofern alles kompiliert wird, können Sie jetzt den Multifunktionsleistencode und den XML-Code in eine eigene Klassenbibliotheksassembly verschieben. Verweisen Sie vom Word-Add-In auf diese neue Assembly, und verschieben Sie den Code entsprechend.

So verschieben Sie den Multifunktionsleistencode und XML-Code

  • Zeigen Sie im Menü Datei auf Hinzufügen, und klicken Sie dann auf Neues Projekt.

  • Erweitern Sie im Dialogfeld Neues Projekt hinzufügen in der Liste der Projekttypen entweder den Knoten Visual Basic oder den Knoten Visual C#.

  • Wählen Sie den Knoten Windows aus.

  • Wählen Sie im Bereich Vorlagen die Option Klassenbibliothek aus.

  • Geben Sie den Namen CitationsRibbon ein, und klicken Sie dann auf OK.

  • Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektknoten CitationsAddinWord, und klicken Sie dann auf Verweis hinzufügen.

  • Klicken Sie auf die Registerkarte Projekte, wählen Sie das Projekt CitationsRibbon aus, und klicken Sie dann auf OK.

  • Klicken Sie im Projektmappen-Explorer im Projekt CitationsRibbon mit der rechten Maustaste auf Class1.vb oder Class1.cs, und klicken Sie dann auf Löschen. Klicken Sie auf OK, um den Löschbefehl zu bestätigen.

  • Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektknoten CitationsRibbon, zeigen Sie auf Hinzufügen, und klicken Sie dann auf Vorhandenes Element.

  • Navigieren Sie im Dialogfeld Vorhandenes Element hinzufügen zu dem Ordner, der die Datei RibbonCode.vb oder RibbonCode.cs und die Datei RibbonCode.xml enthält. Stellen Sie das Dialogfeld so ein, dass alle Dateien angezeigt werden. Markieren Sie beide Dateien, und klicken Sie dann auf Hinzufügen.

  • Wählen Sie im Projektmappen-Explorer die Datei RibbonCode.xml aus. Ändern Sie dann mithilfe des Fensters Eigenschaften die Eigenschaft Buildvorgang in Eingebettete Ressource.

  • Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektknoten CitationsRibbon, und klicken Sie dann auf Verweis hinzufügen.

  • Klicken Sie auf die Registerkarte .NET, und wählen Sie dann die folgenden Assemblys aus (drücken Sie zur Auswahl mehrerer Assemblys die STRG-Taste):

    • Microsoft.Office.Tools.Common

    • Microsoft.Office.Tools.Common2007

    • Microsoft.VisualStudio.Tools.Applications.Runtime

  • Klicken Sie auf OK.

  • Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektknoten CitationsRibbon, und klicken Sie dann auf Verweis hinzufügen.

  • Klicken Sie auf die Registerkarte COM, wählen Sie Microsoft Office 12.0-Objektbibliothek aus, und klicken Sie dann auf OK.

  • Klicken Sie im Projektmappen-Explorer im Projekt CitationsAddInWord mit der rechten Maustaste auf RibbonCode.xml, und klicken Sie dann auf Löschen. Klicken Sie auf OK, um den Löschvorgang zu bestätigen.

Öffnen Sie im Projekt CitationsRibbon die Quelldatei RibbonCode.vb oder RibbonCode.cs. Entfernen Sie die Imports- oder using-Anweisung für System.Windows.Forms. Sie müssen zudem den gesamten Code entfernen, der sich auf die partielle Klasse ThisAddIn bezieht. Wenn Sie C# verwenden, ändern Sie den Namespace von CitationsAddinWord in CitationsRibbon. Öffnen Sie im Projekt CitationsAddInWord die RibbonCode-Quelldatei. Entfernen Sie die RibbonCode-Klasse und die ICitationParent-Schnittstellendefinition. Fügen Sie dann im Projekt CitationsAddInWord jeweils am Anfang der Datei die folgende Imports- oder using-Anweisung in der RibbonCode-Klassendatei und in der ThisAddin-Klassendatei ein:

Visual Basic

Imports CitationsRibbon

C#

using CitationsRibbon;

Als letzten Schritt müssen Sie die GetCustomUI-Methode der RibbonCode-Klasse in Ihrem Projekt CitationsRibbon ändern, um den richtigen vollqualifizierten Namen für die XML-Ressource im Aufruf an GetResourceText zu übergeben. Jetzt können Sie die Projektmappe kompilieren und testen. Da Sie den Code nun vollständig angepasst haben, können Sie das Add-In für einen anderen Host ändern, ohne viele Arbeitsschritte nochmals durchführen zu müssen.

 

Schlussbemerkung

Die Möglichkeit, verwaltete Add-Ins und Aufgabenbereiche auf Anwendungsebene zu erstellen, eröffnet ein vollkommen neues Potenzial für die Entwicklung von Lösungen auf Basis von Microsoft Office-Anwendungen. Sie können mit geringem Aufwand Ihre Entwürfe für die häufigere Wiederverwendung in anderen Lösungen modifizieren.

 

Der Autor

Brian A. Randell ist leitender Berater bei MCW Technologies, LLC. Er unterrichtet Entwickler in Microsoft-Technologien und arbeitet dabei mit neuen und im Entstehen befindlichen Technologien wie 2007 Microsoft Office System, Visual Studio 2005 und Visual Studio Team System. Er unterstützt zudem Kunden wie Microsoft, American Honda und DELL weltweit beim Entwurf und der Implementierung von Systemen. Der Microsoft MVP hilft Kunden durch Schulungen, Beratung und durch Vorträge auf Veranstaltungen wie VSLive!, Tech•Ed und Professional Developers Conference (PDC) dabei, das Potenzial ihrer Software optimal auszuschöpfen. Darüber hinaus gibt er sein Wissen über das geschriebene Wort weiter. Er ist Mitautor von Effective Visual Basic und hat Artikel für das MSDN-Magazin und Microsoft verfasst. Er ist technischer Mitarbeiter von Pluralsight und Autor des Applied Team System-Kurses von Pluralsight. Sie können Brian über sein Blog erreichen.

 

Weitere Ressourcen

Weitere Informationen zu den in diesem Artikel erwähnten oder verwendeten Produkten und Technologien finden Sie unter: