Silverlight - Dynamischer Content mittels Reflection

by Gregor Biswanger 11. Mai 2009 04:19

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.
kick it on dotnet-kicks.de

Kommentare

Powered by BlogEngine.NET 1.4.5.0
Theme by Extensive SEO

Über den Autor

Gregor Biswanger

Microsoft MVP für Client App Dev
XING

Gregor Biswanger (Microsoft MVP für Client App Dev) ist freier Consultant, Trainer, Autor und Speaker.


Seine Schwerpunkte liegen im Bereich der .NET-Architektur, agilen Prozessen und XAML. Er veröffentlichte vor kurzem seine DVD´s mit Video-Trainings zum Thema „Meine erste Windows 8 App“, „Windows Store Apps mit XAML und C#“ und „WPF 4.5 und Silverlight 5“ bei Addison-Wesley von video2brain.


Biswanger ist auch im Auftrag von Intel GmbH als Technologieberater für die Intel Developer Zone aktiv und ist Leader bei der Ingolstädter .NET Developers Group (INdotNET). 

 

Video über mich:
http://www.youtube.com/watch?v=mx_6SiiLxjk


Basta! 2011 Speaker

CLIPer

MCTS
Windows SharePoint Services 3.0 – Application Development (MCTS)