Event für das Schließen der Anwendung

  • WPF

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Trudi.

    Event für das Schließen der Anwendung

    Hey,

    bei Windows Forms gab es das Event System.Windows.Forms.Application.ApplicationExit, welches ich bei WPF leider nicht finden konnte.
    Gibt es das auch bei WPF?

    Ich arbeite mit dem MVVM-Pattern und habe in einem ViewModel eine Klasse erstellt, die noch was aufräumen muss wenn die Anwendung geschlossen wird (.Dispose()) :)

    MfG,
    Trudi

    VB.NET-Quellcode

    1. Application.Current.Shutdown()
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hey,
    vermutlich habe ich mich falsch ausgedrückt, System.Windows.Forms.Application.ApplicationExit ist ein Event, wo ich meine Funktion per AddHandler eintragen konnte.
    Aber trotzdem danke für deine Antwort, bei Application.Current hab ich das Event Application.Current.Exit gefunden, das das ist, was ich gesucht habe.

    EDIT: Komischerweise wird das Event Application.Current.Exit gar nicht aufgerufen wenn ich mein Programm beim debuggen beende. Wieso? O.o

    VB.NET-Quellcode

    1. AddHandler Application.Current.Exit, AddressOf OnApplicationExit
    2. ' ...
    3. Private Sub OnApplicationExit(sender As Object, e As ExitEventArgs)
    4. ' Cleanup
    5. HotKeyManager.Dispose()
    6. End Sub


    Die Funktion um AddHandler hab ich nicht mitkopiert, aber es ist sicher, das das aufgerufen wird.
    Selbst Application.Current.Shutdown() funktioniert nicht...

    MfG, Trudi

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Trudi“ ()

    @Trudi: Und über das Closing-Event des Hauptfensters:

    VB.NET-Quellcode

    1. Private Sub Window_Closing(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles MainWindow.Closing
    2. MessageBox.Show("Exit")
    3. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Window_Closing geht nicht, das Problem dabei ist, dass das Objekt in der ViewModel-Klasse erstellt wird und da auch gebraucht wird:

    VB.NET-Quellcode

    1. Class MainViewModel
    2. Inherits ViewModelBase
    3. Private HotKeyManager As GlobalHotKeyManager
    4. Public Sub New()
    5. AddHandler Application.Current.Exit, AddressOf OnApplicationExit ' Funktioniert nicht
    6. Me.HotKeyManager = New GlobalHotKeyManager()
    7. HotKeyManager.RegisterHotKey(New HotKey(Key.L, KeyModifier.CTRL, AddressOf OnHotkey))
    8. End Sub
    9. Private Sub OnApplicationExit(sender As Object, e As ExitEventArgs)
    10. ' Cleanup
    11. HotKeyManager.Dispose()
    12. End Sub
    13. Public Sub OnHotkey()
    14. MessageBox.Show("HOTKEY")
    15. End Sub
    16. End Class


    Das Problem ist ziemlich nervig, weil ich muss die Hotkeys wieder "unregistrieren". Immer wenn ich das Debuggen stoppe kann ich noch die Hotkeys benutzen und meine MessageBox erscheint... Der prozess kann also gar nicht geschlossen werden...
    Mit den Hotkeys und den damit verbundenen WinAPI Zugriffen hängt das auch nicht zusammen (habs gerade ausprobiert)

    MfG Trudi

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Trudi“ ()

    Und wenn Du von Window_Closing() aus ViewModel.Dispose() aufrufst?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Komischerweise funktioniert das ganze, wenn ich mein ViewModel nicht im XAML definiere :huh:

    Bisher habe ich das immer so gemacht und es hat nicht funktioniert:

    XML-Quellcode

    1. <Window.Resources>
    2. <vm:MainViewModel x:Key="mainViewModel" />
    3. </Window.Resources>


    Wenn ich das aber so mache, dann funktioniert es (Ohne Window_Closing!):

    VB.NET-Quellcode

    1. Public Partial Class MainWindow
    2. Inherits Window
    3. Public mainViewModel As MainViewModel
    4. Public Sub New()
    5. InitializeComponent()
    6. Me.mainViewModel = New MainViewModel()
    7. Me.DataContext = mainViewModel
    8. End Sub
    9. End Class


    Manchmal würde ich echt gerne wissen was Visual Studio da anstellt :)

    MfG Trudi

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Trudi“ ()

    Wpf macht halt viel Gewese mittm Dispatcher

    VB.NET-Quellcode

    1. Public Sub New()
    2. AddHandler System.Windows.Threading.Dispatcher.CurrentDispatcher.ShutdownStarted, Sub(s, e) MessageBox.Show("Schluss")
    3. End Sub
    das fonzt scheints zuverlässig.

    DataContext im Codebehind zu setzen tätich vermeidigen, wenns irgend geht.
    Mitm Dispatcher funktionierts aber auch nicht. Keine Ahnung worans liegt aber hier ist wie ichs umgesetzt habe:

    VB.NET-Quellcode

    1. Public Class MainViewModel
    2. Inherits ViewModelBase
    3. Private HotKeyManager As GlobalHotKeyManager
    4. Public Sub New()
    5. AddHandler Dispatcher.CurrentDispatcher.ShutdownStarted, AddressOf CurrentDispatcher_ShutdownStarted
    6. Me.HotKeyManager = New GlobalHotKeyManager()
    7. HotKeyManager.RegisterHotKey(New HotKey(Key.L, KeyModifier.CTRL Or KeyModifier.ALT, AddressOf OnHotkey))
    8. End Sub
    9. Private Sub CurrentDispatcher_ShutdownStarted(sender As Object, e As EventArgs)
    10. ' Cleanup
    11. HotKeyManager.Dispose()
    12. End Sub
    13. Public Sub OnHotkey()
    14. MessageBox.Show("HOTKEY")
    15. End Sub
    16. End Class


    Wenn ich den DataContext im wieder im Codebehind setze funktionierts.
    Wieso sollte man das denn lassen? Weils vom Codestil her nich gut ist?
    Joa, so tragisch ist das für mich nicht, habe dann nur eine Liste die übers ViewModel bereitgestellt wird.
    Aber Binding-Picking ist ne feine Sache :)

    Die Klasse die "disposed" werden muss, wenn die Anwendung schließt, gibts auch nur in dem einem ViewModel.

    MfG