Von der Datenbank bis zur Oberfläche mit .NET, Teil 5: Desktop- und Browseranwendung mit Silverlight

Seite 3: Fenster

Inhaltsverzeichnis

Das Hauptfenster besteht in der WPF-Anwendung aus MainWindow.xaml, MainWindows.xaml.cs und MainWindowViewModel.cs. Die drei Dateien lassen sich aus dem WPF-Projekt übernehmen; es sind aber auch hierbei einige Änderungen notwendig.

Die Startdatei in Silverlight heißt im Standard MainPage.xaml statt MainWindows.xaml. Möchte der Entwickler den gleichen Datei- und Klassennamen wie in WPF verwenden, muss er in der App.xaml.cs-Datei die Routine Application_Startup verändern: MainPage ist zu ersetzen durch MainWindow.

  private void Application_Startup(object sender, StartupEventArgs e)
{
this.RootVisual = new MainWindow();
}

Nun sind erst mal die Änderungen in MainWindow.xaml an der Reihe. Das Wurzelelement für eine Silverlight-Anwendung ist <UserControl>. <RibbonWindow>, das in WPF zum Einsatz kam, ist auszutauschen.

Für das Hauptfenster gilt es zu beachten, dass es in Silverlight kein offizielles Ribbon-Steuerelement von Microsoft gibt, dafür aber auf Codeplex ein Beispiel, das aber für Silverlight 3 ist und seitdem nicht weiterentwickelt wurde. Darüber hinaus gibt es kommerzielle Anbieter solcher Steuerelemente (z. B. Sandribbon von divelements, RibbonView von Telerik, xamribbon von Infragistics und das Silverlight Ribbon von Devexpress. Das Tutorial soll aber ohne weitere Zusatzkosten lauffähig sein, sodass die Silverlight-Lösung auf das Ribbon verzichtet. An dessen Stelle soll eine einfache Befehlsleiste mit den Schaltflächen "Neuer Passagier" und "Ende" treten (siehe Abb. 3 und 4). Die Befehlsleiste wird realisiert durch ein <StackPanel>-Element mit einem <Image>- und zwei <Button>-Elementen. Alle anderen Aktionen sind ja innerhalb der beiden Views "BuchungsView" und "NeuerPassagierView" bereits als Schaltflächen hinterlegt.

Buchungsmaske in der Silverlight-Lösung mit einfacher Schaltflächenleiste statt Ribbon-Steuerelement (Abb. 3)

Neue Passagier-Ansicht in der Silverlight-Lösung (Abb. 4)

Als Nächstes schlagen wieder syntaktische Unterschiede beim WPF- und Silverlight-XAML zu: Visual Studio beschwert sich in den Datenvorlagen über <DataTemplate DataType="{x:Type Ansichten:BuchungViewModel}">. In Silverlight ist die Syntax anders und einfacher: <DataTemplate DataType="Ansichten:BuchungViewModel">. Leider würde das in WPF nicht funktionieren. Listing 5 zeigt MainWindows.xaml mit verändertem Wurzelelement, Ersetzung des Ribbon-Steuerelement durch eine eigene Schaltflächenleisten und den Änderungen in den Datenvorlagen.

Während die MainWindow.xaml.cs so bleiben kann wie in WPF, muss das MainWindowViewModel.cs etwas anders aufgebaut sein (siehe Listing 6). Es gibt keine Ribbon-Registerkarten mehr, und folglich braucht man dafür auch keine Properties im ViewModel. Stattdessen wird zum Umschalten zwischen den beiden Views nun eine Schaltfläche verwendet, die an das zusätzliche Command-Objekt NeuerPassagierCommand gebunden ist.

Bei der Realisierung von Ende() muss man etwas ändern, denn Application.Current.MainWindow.Close() ist nur verfügbar, wenn die Silverlight-Anwendung außerhalb des Browser läuft. Innerhalb des Browsers kann die Silverlight-Anwendung den Browser nicht eigenständig schließen, sondern nur das umgebende Browser-Fenster "höflich" dazu auffordern. Das Fenster wird aber typischerweise erst den Benutzer fragen, ob er damit einverstanden ist. Daher prüft Ende(), ob Application.Current.IsRunningOutOfBrowser "true" oder "false" ist.