26

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.

Rocketq
  • 5,423
  • 23
  • 75
  • 126

5 Answers5

64

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.

Ofir
  • 5,049
  • 5
  • 36
  • 61
  • Could you look my code one more time, I did exatly like you said, but I get other problems – Rocketq Dec 03 '13 at 09:34
  • 1
    I tied it and it's working fine. what is your issue? give me more details. try to remove the property `ShutdownMode="OnExplicitShutdown"` and let me know if it works – Ofir Dec 03 '13 at 11:15
  • 1
    I have removed `ShutdownMode="OnExplicitShutdown"` and it started to work properly. Thank you a lot. – Rocketq Dec 03 '13 at 12:58
  • That not how you are supposed to do it. Just `protected override void OnExit(ExitEventArgs e)` in the code behind. Register to class own events is avoidable, avoid it. – Orace Sep 21 '22 at 09:14
13

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);
            }
}
BRAHIM Kamel
  • 13,492
  • 1
  • 36
  • 47
6

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
}
Shleemypants
  • 2,081
  • 2
  • 14
  • 21
5

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.

Jouan Antoine
  • 101
  • 1
  • 6
  • Please note: https://stackoverflow.com/questions/46556240/wpfmvvm-library-system-windows-interactivity-in-not-available-anymore – dmedine Sep 07 '21 at 06:28
  • You also need to implement RelayCommand in order for this solution to work. – dmedine Sep 07 '21 at 06:30
0
  1. Make sure that the namespace (MyApp) matches "x:Class=MyApp..."
  2. Under properties for <Application></Application>, double click on the textbox next to 'Exit'.
  3. If you get "Unable to add event handler" then Rebuilding the project fixed it for me.

XAML

<Application x:Class="MyApp.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"
>

Code behind

using System.Windows;

namespace MyApp
{ 
   public partial class App : Application
   {
     private void Application_Exit(object sender, ExitEventArgs e)
     {
         //your code
     }
  }
}
icernos
  • 395
  • 3
  • 6