Seiten

Dienstag, 12. Oktober 2010

Expression Blend 4 Add-In für Zugriff auf Xaml-Quellcode eines Silverlight 4 Projekts

Dieser Artikel beschreibt, wie man in einem Add-In für Expression Blend 4 Zugriff auf den Xaml-Quellcode von einem Xaml-Dokument eines Silverlight 4 Projekts erhält, das aktuell in der Entwicklungsumgebung geöffnet ist.

Im Ergebnis liefert der vorgestellte Beispiel-Quellcode einen String zurück, der das Xaml des aktuellen Xaml-Dokuments (z.B. MainPage.xaml, App.xaml, UserControl.xaml oder RecourceDictionary.xaml) enthält.

Beispiel-Projekt

Es wird ein kleines Add-In für Expression Blend 4 erstellt, dessen Oberfläche aus einem Button besteht. Mit einem Klick auf den Button wird das Xaml des aktuellen Xaml-Dokuments abgerufen und in einer MessageBox dargestellt.

Generelle Vorgehensweise

Die ActiveDocument Eigenschaft der Schnittstelle IDocumentService gibt Zugriff auf das aktuelle Xaml-Dokument. Das ActiveDocument wird zu einem SceneDocument umgewandelt. Und das SceneDocument stellt über die Eigenschaft XamlDocument.Text den Xaml-Quellcode des aktiven Xaml-Dokuments bereit.

Schritt für Schritt

Schritt 1 - Das Projekt für die Erweiterung erstellen und konfigurieren

Für diesen Schritt verweise ich auf einen Artikel von Timmy Kokke, in dem unter dem Punkt "Configuring the extension project" (Konfiguration des Erweiterungsprojekts) die Vorgehensweise zum Erstellen und Konfigurieren des WPF-Entwicklungsprojekts bestens beschrieben ist.

Als ergänzenden Tipp empfehle ich, Visual Studio 2010 als Adiminstrator auszuführen: Rechtklick auf die Verknüpfung zum Starten von Visual Studio 2010 und Linksklick auf "Als Administrator ausführen".

Schritt 2 - Assemblyverweise

Für den Zugriff auf die benötigten Funktionalitäten muss im Projekt auf die folgenden Assemblies verwiesen werden (in alphabetischer Reihenfolge):

Microsoft.Expression.DesignModel
Microsoft.Expression.DesignSurface
Microsoft.Expression.Extensibility
Microsoft.Expression.Framework
Microsoft.Expression.Markup
System.ComponentModel.Composition

Zu beachten ist, dass der Verweis auf Microsoft.Expression.DesignSurface nur funktioniert, wenn in den Projekt-Eigenschaften in der Registerkarte "Kompilieren" unter "Erweiterte Kompilierungsoptionen ..." als Ziel-Framework das .Net Framework 4 gesetzt wird.

Schritt 3 - Die UI des Add-In

Für die UI des Add-In wird dem Projekt durch Rechtsklick auf das Projekt -> Hinzufügen -> Neues Element hinzufügen ein neues WPF-Benutzersteuerelement hinzugefügt. Das Benutzersteuerelement erhält den Namen "XamlCatcherUI.xaml". Ein eventuell schon vorhandenes UserControl wird am besten gelöscht.

Hier ist der Xaml-Quellcode für die UI des UserControl:


Schritt 4 - Die Klasse XamlCatcherExtension

Dem Projekt wird eine neue Klasse hinzugefügt. Diese Klasse erhält den Namen XamlCatcherExtension.vb. Hier ist der vollständige Quellcode dieser Klasse (VB.NET):


In der Ereignisbehandlung des Load-Ereignisses wird der Oberfläche der Entwicklungsumgebung von Expression Blend 4 das Benutzersteuerelement als neue RegisterPalette hinzugefügt. Wie das im Einzelnen funktioniert beschreibt Timmy Kokke in seinem Artikel. Die Schnittstelle IDocumentService gibt Zugriff auf das Dokument, das in Expression Blend 4 aktiv angezeigt wird.

Dem Click-Ereignis des Button btCatchXaml des Benutzersteuerelements wird ein Delegat hingefügt, der auf die Routine GetXamlSourceCode zeigt. Die Routine GetXamlSourceCode enthält die eigentliche Programmlogik für den Zugriff auf den Xaml-Quellcode eines aktuellen Dokuments in Expression Blend 4.

In der If-Verzweigung der Routine GetXamlSourceCode wird zunächst auf die DocumentReference.Path-Eigenschaft des aktuellen Dokuments zugegriffen. Hierdurch bekommt man den vollständigen Datei-Pfad des Dokuments, das in der Ansicht von Expression Blend 4 derzeit aktiv ist. Die Path-Eigenschaft liefert den Pfad als String. Um zu prüfen, ob es sich bei dem aktuellen Dokument in der Ansicht von Expression Blend 4 um ein Xaml-Dokument handelt, wird die Methode .String.EndsWith() benutzt. Mit dieser Methode wird abgefragt, ob der Pfad-Wert mit ".xaml" endet, was ein untrügliches Zeichen dafür ist, dass es sich beim aktuellen Dokument um ein Xaml-Dokument handelt.

Wenn die If-Verzweigung True zurückgibt, wird eine Variablen des Typs SceneDocument deklariert. Die Variable erhält den Namen "sd". Dieser Variablen wird das zum SceneDocument gecastete ActiveDocument zugewiesen.

Als letztes wird die Eigenschaft XamlDocument.Text der Variable sd abgefragt. Diese Eigenschaft liefert das Xaml des aktiven Dokuments als String-Wert zurück. Der erhaltene String wird dann in einer MessageBox angezeigt.

Das war's.

Der Rückgabewert kann nun für die weitere Verarbeitung verwendet werden, allerdings in der dargestellten Vorgehensweise nur ReadOnly. Nützlich kann dieser Zugriff zum Beispiel sein, um den Quellcode eines Xaml-Dokuments direkt aus Expression Blend 4 heraus zu drucken oder an einem anderen Ort lokal zu speichern, beispielsweise als temporäre Sicherungskopie.

Download: Vollständiger Quellcode des Beispiel-Add-In Projekts.

Keine Kommentare:

Kommentar veröffentlichen