2009-03-03 17 views
31

Ich schreibe derzeit eine WPF-Anwendung, die Befehlszeilenargument-Behandlung in App.xaml.cs (die notwendig ist, da das Startup-Ereignis die empfohlene Möglichkeit zu erhalten scheint bei diesen Argumenten). Aufgrund der Argumente möchte ich das Programm an dieser Stelle schon beenden, was meines Wissens nach in WPF mit Application.Current.Shutdown() geschehen sollte oder in diesem Fall (wie ich mich im aktuellen Anwendungsobjekt befinde) wahrscheinlich auch nur .Herunterfahren einer WPF-Anwendung von App.xaml.cs

Das einzige Problem ist, dass dies nicht richtig zu funktionieren scheint. Ich bin mit dem Debugger und dem Code durchgegangen, nachdem die Shutdown() Zeile immer noch ausgeführt wird, was zu Fehlern später in der Methode führt, da ich erwartete, dass die Anwendung nicht so lange lebt. Auch das Hauptfenster (in XAML im Attribut StartupUri deklariert) wird weiterhin geladen.

Ich habe die Dokumentation dieser Methode überprüft und nichts in den Anmerkungen gefunden, die mir sagen, dass ich es nicht während Application.Startup oder Application überhaupt verwenden sollte.

Also, was ist der richtige Weg, um das Programm an diesem Punkt zu verlassen, ich. e. der Startup Event-Handler in einem Application Objekt?

+1

Was sind die Fehler, die Sie bekommen? Bitte aktualisieren Sie Ihre Frage. –

+0

Klicken Sie auf [Hier] (http://Stackoverflow.com/a/6602102/2342414) für eine einfache und funktionierende Antwort – benshabatnoam

Antwort

46

zuerst die StartupUri Eigenschaft von App.xaml entfernen, und dann verwenden Sie die folgende:

protected override void OnStartup(StartupEventArgs e) 
    { 
     base.OnStartup(e); 

     bool doShutDown = ...; 

     if (doShutDown) 
     { 
      Shutdown(1); 
      return; 
     } 
     else 
     { 
      this.StartupUri = new Uri("Window1.xaml", UriKind.Relative); 
     } 
    } 
+0

Funktioniert immer noch nicht richtig :( Insbesondere bekomme ich NullReferenceExceptions im Konstruktor des Hauptfensters, die möglicherweise leicht umgangen werden. Aber soweit ich verstehe, sollte das Herunterfahren der Anwendung funktionieren, ohne das von StartupUri referenzierte Fenster zu instanziieren. – Joey

+4

Ich änderte meine Antwort, um Ihnen zu zeigen, wie Sie vermeiden können, dass Ihr Hauptfenster erstellt wird entfernen Sie das StartupUri von App.xaml. –

+1

Danke. Es funktioniert jetzt. Aber ich finde es irgendwie unintuitiv, dass das StartupUri immer geladen wird, unabhängig davon, ob die Anwendung bereits beendet worden sein sollte. – Joey

8

Wenn Sie die StartupUri von app.xaml für eine Anwendung mit einem Mainwindow Sie sicher, dass Sie die folgenden machen vornehmen müssen entfernen Rufen Sie Ihre OnStartup-Methode auf, andernfalls wird die Anwendung nicht beendet, wenn Ihr MainWindow geschlossen wird.

this.ShutdownMode = System.Windows.ShutdownMode.OnMainWindowClose; 

@Frank Schwieterman, etwas in dieser Richtung können Sie mit Ihrer Konsole Fenster Problem helfen.

+1

Lebensretter! Vielen Dank! – Pascal

+0

IMNSHO: Dies ist die richtige Antwort auf diese Frage ... –

+0

Diese Seite beschreibt die WPF Start und Herunterfahren sehr klar ... http://www.blackwasp.co.uk/WPFStartupShutdown.aspx –