Bei Silverlight Anwendungen kann sich jederzeit der
Inhaltswunsch ausdehnen. Umso ärgerlicher wird es, wenn die Anwendung zu wenig
Flexibilität dafür bietet. Gewünscht wäre eine Art Content Management System
(kurz CMS) für Silverlight. Diesem Wunsch kann nachgegangen werden mittels
Reflection.
Silverlight hat längst ab der Version 2 die Reflection (System.Reflection) Funktionalität
integriert. Mit Reflection können während der Anwendungslaufzeit .NET-Assemblys
geladen und ausgewertet werden. Es kann sogar der Source-Code von
.NET-Anwendungen übersetzt werden kann.
Content Definieren
Zu Beginn müssen erst einmal bestimmte Kriterien für den
Content Definiert werden. Eine geeignete Lösung wäre hierbei ein Attribut. Das
Attribut soll später die XAML-Pages beschreiben, wie deren Name, Beschreibung
und Kategorie ist.
Nach dem erzeugen eines neuen Silverlight-Projekts, hier im
Beispiel-Code wird es ein Seilverlight 3 (BETA) Projekt, wird ein Verzeichnis
mit Extension und einer Silverlight-Klasse ContentPageAttribute
angelegt. Diese Klasse leitet dann von Attribute (System.Attribute) ab. Danach werden die Definitionen ganz einfach
mittels Properties, die im Konstruktor festgelegt werden umgesetzt (siehe
Abb.1.1).
Abb.1.1. – Ein Attribut für die
spätere Content Definition anlegen.
Dann wird ein Verzeichnis mit Pages angelegt, wo bereits die
erste XAML-Page mit „Add Items“ hinzugefügt wird. In diesem Beispiel ist die
erste Page die HalloWeltPage.xaml. In der Codebehind-Datei wird auch schon das
eben erzeugte Attribute verwendet, siehe dazu Abb.1.2. Wichtig dabei ist, dass
der korrekte Pfad zur XAML-Datei angegeben wird.
Abb.1.2. – Das selbst erzeugte
Attribut bei einer XAML-Page verwenden.
Dynamik mit dem Content Loader
Das die soeben erzeuge XAML-Page nun mittels Reflection
ausgelesen und behandelt wird, muss dazu einer Helper-Klasse sozusagen als
Content Loader Programmiert werden. Dazu wird eine neue Silverlight-Klasse mit ContentLoader im Verzeichnis Extension
erzeugt.
Diese baut sich folgt auf: Eine Liste von
ContentPageAttribute soll später alle enthaltenen XAML-Pages, die dieses
Attribut definiert haben aufgelistet werden können. Die Liste baut sich durch
eine Reflection Abfrage auf, die durch zwei Foreach-Schleifen die eigene
Assembly nach dem Attribute durchforstet. Am Ende wird die Liste nur noch nach
bestimmten Kriterien durch LINQ sortiert und als Array zurückgegeben (siehe
Abb.1.3.).
Abb.1.3. - Der Content Loader Source-Code
Inhalte Anzeigen
Die Pages sollen nun auf einem bestimmten Bereich einer
Hauptseite angezeigt werden. Dafür wäre eine ListBox als einfaches Menü zur Navigation
sehr gut geeignet. Die Navigation und Aufruf der Pages wird durch einem Silverlight
3 neuem Feature geregelt: Navigation URI Routing.
In der MainPage XAML-Datei wird nun eine ListBox und
Navigation-Frame hinzugefügt. Die Frame Funktion liegt allerdings in der Library
System.Windows.Controls.Navigation,
die erst unter den Projekt-Referenzen hinzugefügt werden muss.
Abb.1.4. – MainPage XAML-Code
In der Code-Behind Datei der XAML-MainPage wird nun ein Array
von ContentPageAttribute angelegt,
wenn die Page beim Lade-Prozess ist, wird das Array durch den ContentLoader gefüllt.
Der ContentLoader ruft mittels Reflection alle Pages mit einer Attribut
Definition auf und übermittelt die wichtigen Informationen. Danach wird die
ListBox listPages mittels
Data-Binding auf das Array gebunden, so dass deren Inhalt wie in der XAML-Datei
Definiert mit dem Namen und der Beschreibung anzeigt. Die ListBox listPages hat zudem ein Event SelectionChanged, das bei einer Auswahl
im Menü, der Pfad zum Namen mittels Navigate aufgerufen wird. Silverlight 3
ladet dynamisch den gewünschten Inhalt im Frame an und bietet zudem die
Navigation per URL an.
Abb.1.5. – MainPage.XAML – Code-Behind
Source-Code
Abb.1.6. – Die Struktur der Demo
Applikation
Die Silverlight 3 Anwendung mit Dynamischer CMS Funktion ist
fertig. Um die Anwendung im Browser sehen zu können muss das folgende Plug-In
Installiert werden: Silverlight 3 Beta
SilverlightDynamicCMS Demo
Fazit
Auf viele Einzelheiten wurde bei diesem Artikel verzichtet.
Die Grundkenntnisse von XAML sollten daher vorhanden sein. Das Praktische an
dieser Anwendung ist, dass jederzeit neue Pages hinzugefügt werden können. Dazu
aber kein anderer Code angepasst werden muss. Die einzige Bedingung wäre hier,
die Definition der Page mittels Attribute. Mit ein wenig Handarbeit könnte
diesem Demo hier auch der Inhalt Dynamisch mit einem Flip3D ausgestattet werden,
siehe dazu die Silverlight 3 Beispiele. Der Source-Code selbst und die Idee
dazu, hatte ich dank Oliver Scheer (Microsoft Evangelist für ASP.NET, AJAX und Silverlight)
bekommen.
Download Source-Code
SilverlightDynamicCMS.zip (1,19 mb)
Wenn ihnen der Artikel gefallen hat oder er für sie hilfreich war, bitten "kicken" sie ihn.
