How to use Application.Exit Event in WPF?

65,855

Solution 1

It's quite simple:

Add "Exit" property to the application tag

<Application x:Class="WpfApplication4.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml"
             Exit="Application_Exit">
</Application>

and handle it in the "code behind"

private void Application_Exit(object sender, ExitEventArgs e)
{
    // Perform tasks at application exit
}

The Exit event is fired when the application is shutting down or the Windows session is ending. It is fired after the SessionEnding event. You cannot cancel the Exit event.

Solution 2

you should add app_exit in your xaml code

 <Application x:Class="CSharp.App"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  StartupUri="MainWindow.xaml" 
  ShutdownMode="OnExplicitShutdown"
  Exit="App_Exit"
    >
</Application>

you can just hook the event Closing on your main window like this -

 <Window Closing="Window_Closing">

And in your event do all the work you need

    private void Window_Closing(object sender, CancelEventArgs e)
{
     MessageBox.Show("File deleted");
    var systemPath = System.Environment.GetFolderPath(
                              Environment.SpecialFolder.CommonApplicationData);

            var _directoryName1 = Path.Combine(systemPath, "RadiolocationQ");
            var temp_file = Path.Combine(_directoryName1, "temp.ini");

            if (File.Exists(temp1_file))
            {
                File.Delete(temp1_file);
            }
}

Solution 3

If you don't like adding Exit event to XAML, you could try this alternative.

Add following method to your App.xaml.cs:

protected override void OnExit(ExitEventArgs e)
{
    base.OnExit(e);
    // Your code here
}

Solution 4

If you want to follow MVVM principle you can use System.Windows.Interactivity.WPF.

MainWindow.xaml

<Window x:Class="Endonext.View.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006">

<i:Interaction.Triggers>
    <i:EventTrigger EventName="Closing">
        <i:InvokeCommandAction Command="{Binding WindowClosingCommand, Mode=OneTime}" />
    </i:EventTrigger>
</i:Interaction.Triggers>

MainWindowViewModel.cs

public class MainWindowViewModel 
{
    ICommand WindowClosingCommand => new RelayCommand(arg => this.WindowClosing());

    private void WindowClosing()
    {
      // do what you want.
    }
}

This approach is more testable. Have a nice day.

Share:
65,855
Rocketq
Author by

Rocketq

Updated on November 12, 2020

Comments

  • Rocketq
    Rocketq over 3 years

    I need to delete some certain files, then user closes program in WPF. So I tried MDSN code from here http://msdn.microsoft.com/en-us/library/system.windows.application.exit.aspx this way:

    this code located here App.xml.cs

    public partial class App : Application
    {
     void App_Exit(object sender, ExitEventArgs e)
        {
           MessageBox.Show("File deleted");
            var systemPath = System.Environment.GetFolderPath(
                                      Environment.SpecialFolder.CommonApplicationData);
    
                    var _directoryName1 = Path.Combine(systemPath, "RadiolocationQ");
                    var temp_file = Path.Combine(_directoryName1, "temp.ini");
    
                    if (File.Exists(temp1_file))
                    {
                        File.Delete(temp1_file);
                    }
    
        }
    
    }
    
    // App.xaml
    <Application x:Class="ModernUIApp1.App"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 StartupUri="MainWindow.xaml"
                 ShutdownMode="OnExplicitShutdown"
                 Exit="App_Exit">
        <Application.Resources>
    

    First of all it doesn't delete files, secondly this program stays in the process after I pushed exit button( this is really strange). This code don't give any errors. And finally it doesn't show MessageBox So anything wrong here?

    I think he just can`t find this function.