MahApps.Metro in Verbindung mit der PRISM-Bibliothek (Teil 1: Erstellung der Solution)

MahApps.Metro ist eine Library, welche eine WPF App recht schnell in den Metro Style umwandeln kann. Die Bibliothek bringt allerhand Controls, Styles und sogar Icons mit und wird auch über NuGet bereitgestellt. Das komplette Projekt ist OpenSource und der Quellcode steht auf GitHub zur Verfügung. PRISM ist ebenfalls eine OpenSource Bibliothek, welche die Erstellung von modularen WPF-Anwendungen unterstützt. Dabei kommen moderne Design-Patterns wie MVVM, EventAggregator oder SoC (Separation of Concerns) zum Einsatz. Für die Implementierung von lose gekoppelten Modulen werden diverse Interfaces und Klassen zur Verfügung gestellt, die sich dann nahtlos in die Gesamtanwendung integrieren lassen. Der PRISM Quellcode ist ebenfalls via GitHub verfügbar. Der folgende Artikel soll nun erläutern wie man MahApps.Metro und PRISM zusammen verwenden kann.

Erstellung der PRISM-Basisanwendung

So dann legen wir mal los mit der Erstellung unserer PRISM-Basisanwendung. Zunächst wird eine Standard WPF-Anwendung über VisualStudio erstellt. Das sieht wie folgt aus:

PrismMahAppsSample_01

In PRISM-Anwendungen wird das Startprojekt oder Hauptprojekt (also die ausführbare EXE-Datei) oftmals als Shell bezeichnet. Das Shell-Projekt ist die Host-Applikation in welche später die einzelnen Module geladen werden. Darüber hinaus definiert dieses Projekt das allgemeine Aussehen der Applikation und definiert einige applikationsübergreifende Services. Die Hauptlogik der Anwendung wird dann in die einzelnen Module ausgelagert. Module sind eigenständige Funktionsblöcke, die spezifische Funktionen implementieren (z.B. Userverwaltung, Profil-Management, usw.). Dabei enthalten diese Module die benötigten Views, Services, Datenobjekte usw. um die festgelegten Aufgaben zu erfüllen. Eine typische PRISM-Applikation besteht im Normalfall aus mehreren Modulen, die dann die Business-Logik enthalten. Das Shell-Projekt selbst enthält keine spezifische Business-Logik. Darüber hinaus stellt die Shell eine oder mehrere Regionen bereit, die die Module zur Anzeige der implementierten Views nutzen können. Dazu aber später mehr. Zunächst benenne ich das eben erstellte Projekt um in „Projektname.Shell“ und verschiebe es gleichzeitig in den Projektmappenordner „Shell“. Innerhalb dieses Ordners landen später auch alle Projekte, die in direkter Verbindung mit dem Hauptfenster stehen. Danach sieht die Projektstruktur wie folgt aus:

PrismMahAppsSample_02

Danach können die benötigten Projektreferenzen hinzugefügt werden. Für diese Beispielanwendung werden die folgenden DLLs benötigt:

  • Prism.dll (via NuGet)
  • Prism.Wpf.dll (via NuGet)
  • Prism.Unity.Wpf.dll (via NuGet)
  • Microsoft.Practices.ServiceLocation.dll (via NuGet)
  • Microsoft.Practices.Unity.dll (via NuGet)

Allen oben genannten DLLs stehen via NuGet zu Verfügung.

Erzeugung des Bootstrappers

Der Bootstrapper ist für die Initialisierung einer PRISM-Anwendung verantwortlich. Die PRISM-Bibliothek enthält standardmäßig eine abstrakte „Bootstrapper“-Basisklasse, die so angepasst werden kann, dass sie mit nahezu jedem beliebigen DependencyInjection-Container verwendbar ist. Die folgenden Methoden können in der eigenen Implementierung des Bootstrappers überschrieben werden:

PrismMahAppsSample_03
Bootstrapper-Prozess (Quelle [1])

Für die Erstellung des Bootstrappers geht man wie folgt vor:

Hinweis: Für dieses Beispiel wird Unity als DependencyInjection-Container verwendet und aus diesem Grund wird auch die spezielle „UnityBootstrapper“-Basisklasse für den Bootstrapper verwendet. PRISM unterstützt jedoch noch weitere DI-Container und stellt für diese ebenso spezielle Basisklassen bereit. Also wenn ein anderer DI-Container verwendet werden soll einfach mal prüfen, ob PRISM bereits eine entsprechende Basisklasse bereitstellt.

  1. Hinzufügen einer neuen Klasse mit dem Namen „Bootstrapper.cs“ zum Shell-Projekt
  2. Die folgenden using-Statements zur neu erstellten Klassen hinzufügen
  3. Die Signatur der Bootstrapper-Klasse wie folgt anpassen
  4. Überschreiben der Methode CreateShell innerhalb der Bootstrapper-Klasse. Innerhalb dieser Methode wird das Hauptfenster der Anwendung erzeugt und zurückgegeben
  5. Überschreiben der InitializeShell-Methode. Innerhalb dieser Methode wird der Shell-Eigenschaft der Basisklasse das Hauptfenster (MainWindow) der Applikation zugewiesen und das Fenster angezeigt.
  6. Überschreiben der Methode ConfigureModuleCatalog-Methode. Innerhalb dieser Methoden wird der sogenannten Modulkatalog mit Modulen gefüllt. Diese Modulkatalog enthält Metadaten über die Module, die innerhalb der Anwendung verwendet werden. Mehr Details zum Füllen des Modulkatalogs folgen später.
  7. Jetzt muss noch eine Instanz des Bootstrappers erzeugt werden. Dies wird erledigt man in der Datei App.xaml.cs innerhalb des EventHandlers des Startup-Events. Danach wird der Bootstrapper direkt beim Applikationsstart erzeugt.
  8. Jetzt muss noch StartupUri-Attribut aus der Datei App.xaml entfernt werden. Da wir ja das Hauptfenster der Anwendung manuell innerhalb des Bootstrappers erzeugen wird dieses Attribut nicht mehr benötigt. Danach sieht die App.xaml wie folgt aus:

Damit wären die grundlegende Schritte für die Erstellung einer PRISM-Anwendung abgeschlossen und die Applikation sollte sich kompilieren lassen und mit dem Standard-Style starten

PrismMahAppsSample_04

Einbinden MahApps.Metro

Um MahApps.Metro verwenden zu können müssen zunächst die erforderlichen Referenzen zum Projekt hinzugefügt werden. Dies kann man einfach über den NuGet-Paketmanager machen. Um die aktuellste Version von MahApps.Metro zu bekommen kann man die Checkbox „Vorabversion einbeziehen“ markieren (damit erhält man auch Vorabversionen mit den aktuellsten Features):

PrismMahAppsSample_05

Um jetzt MahApps.Metro zu verwenden muss unser Hauptfenster (MainWindow.xaml) angepasst werden. Dazu die MainWindow.xaml öffnen und die folgenden Änderungen vornehmen:

  • Einbinden des XAML-Namespace: xmlns:metro=“http://metro.mahapps.com/winfx/xaml/controls“
  • Ändern des Window-Tags zu metro:MetroWindow

Danach sollte der XAML-Code unseres MainWindow in etwa so aussehen:

Wenn man die Anwendung jetzt startet möchte wird man einen Fehler vom Compiler erhalten. Es muss noch die CodeBehind-Datei angepasst werden:

Zum Schluss müssen jetzt noch die ResourceDictionaries eingefügt werden. Dies geschieht in der App.xaml:

Nach dem Start der Anwendung sollte das Hauptfenster jetzt so aussehen:

PrismMahAppsSample_06

Damit ist man mit der Erstellung der Basisanwendung soweit fertig. Der Quellcode der gesamten Solution ist am Ende des Artikel zu finden.

Im nächsten Artikel MahApps.Metro in Verbindung mit der PRISM-Bibliothek (Teil 2: Regions und RegionAdapter) geht es um die Unterteilung des Dialogs in einzelne Regionen und das Hinzufügen von Views zu diesen Regionen.

Github-Repository

Der aktuellste Quellcode ist in folgendem Github-Repository verfügbar: https://github.com/steve600/PrismMahAppsSample

Donwload Quellcode

[wpdm_package id=’659′]

Literaturverzeichnis und Weblinks

Abk.Quelle
[1]Initializing Applications Using the Prism Library 5.0 for WPF
Fork me on GitHub