Verfasst von: bletra | 8. Juni 2011

WPF mit mehreren Fenstern starten

Die Projektvorlage für WPF im Visual Studio generiert ein leeres Fenster (MainWindow.xaml) und eine Datei App.xaml. Die Applikation startet standardmäßig mit dem erzeugten Fenster und beendet sich, wenn dieses geschlossen wird. Schaut man in den Code von App.xaml, so findet man die Anweisung StartupUri=“MainWindow.xaml“, was das Start-Verhalten erklärt. Ein Student wollte jedoch die Applikation mit einem Konfigurationsfenster starten und anschließend weitere Fenster öffnen. Schnell fanden wir heraus, wie man eine Methode, ähnlich einer Main-Methode,  definieren kann, die bei Applikationsstart ausgeführt wird. Hierzu muss in App.xaml anstelle der StartupUri das Attribut Startup wie folgt gesetzt werden: Startup=“main“. Diese Methode ist dann in App.xaml.cs zu implementieren. Hier folgte nun das zweite Problem, das Konfigurationsfenster konnte er anzeigen lassen, weitere Fenster jedoch nicht und die Applikation wurde beendet. Der Grund liegt darin, dass standardmäßig die Applikation beendet wird, sobald das letzte Fenster geschlossen wird. Diese Applikationseigenschaft lässt sich durch den ShutdownMode  entweder in App.xaml oder im Code verändern. Folgende Modi werden unterstützt: OnLastWindowClose (default), OnMainWindowClose und OnExplicitShutdown. Wählt man OnExplicitShutdown, so kann an beliebiger Stelle im Code mit App.Current.Shutdown() das Beenden der Applikation erfolgen.

Hier nun eine Beispielapplikation, die die Möglichkeiten verdeutlicht. Zunächst erscheint ein Config-Fenster mit der Möglichkeit, die Applikation zu beenden (btnExit). Anschließend werden zwei Fenster geöffnet, von denen eines als MainWindow deklariert wird — dies erfolgte nur zu Demonstrationszwecken und ist eigentlich nur in Verbindung mit OnMainWindowClose relevant. Die Applikation soll sich beenden, wenn das letzte Fenster geschlossen wird. Dabei ergab sich ein weiteres Problem, obwohl im Debugger eine statische Eigenschaft IsShuttingDown der Klasse Application angezeigt wird, gibt es hierzu keine Dokumentation und diese Eigenschaft ist nicht verfügbar. Daher wird über das Attribut Exit in der App.xaml eine Methode angegeben, die bei Eintreten des Exit-Events ein solches Property der Klasse App explizit setzt. Eine gute Übersicht über den Lebenszyklus einer Applikation bietet Microsoft in „Übersicht über die Anwendungsverwaltung“.

App.xaml:

<Application x:Class="test.App"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  Startup="main"
  ShutdownMode="OnExplicitShutdown"
  Exit="Application_Exit"
>
  <Application.Resources></Application.Resources>
</Application>

App.xaml.cs

public partial class App : Application
{
  private bool isShuttingDown;
  public bool IsShuttingDown { get { return isShuttingDown; } }
  public void main(object sender, StartupEventArgs startupEventArgs)
  {
    isShuttingDown = false;
    Config config = new Config();
    config.ShowDialog();
    if (!isShuttingDown)
    {
      MainWindow mainWin = new MainWindow();
      App.Current.MainWindow = mainWin;
      mainWin.Show();
      AddOn addOnWin = new AddOn();
      addOnWin.Show();
      App.Current.ShutdownMode = ShutdownMode.OnLastWindowClose;
    }
  }
  private void Application_Exit(object sender, ExitEventArgs e)
  {
    isShuttingDown = true;
  }
}

Config.xaml.cs

private void btnExit_Click(object sender, RoutedEventArgs e)
{
  App.Current.Shutdown();
}

Der dargestellte Ansatz lässt sich auch leicht auf ein Login-Fenster übertragen.


Antworten

  1. Oder:

    private void Application_Startup(object sender, StartupEventArgs e)
    {
    SettingsDialog dlg = new SettingsDialog();
    dlg.Closing += new System.ComponentModel.CancelEventHandler(dlg_Closing);
    dlg.Show();
    }

    void dlg_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
    MainWindow main = new MainWindow();
    main.Show();
    }

  2. Dies ist eine sehr gute Alternative. Danke für den Kommentar.


Hinterlasse einen Kommentar

Kategorien