web-dev-qa-db-fra.com

Comment utiliser l'événement Application.Exit dans WPF?

J'ai besoin de supprimer certains fichiers, puis l'utilisateur ferme le programme dans WPF. J'ai donc essayé le code MDSN d'ici http://msdn.Microsoft.com/en-us/library/system.windows.application.exit.aspx de cette façon:

ce code situé ici 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>

Tout d'abord, il ne supprime pas les fichiers, ensuite ce programme reste dans le processus après avoir appuyé sur le bouton de sortie (c'est vraiment étrange). Ce code ne donne aucune erreur. Et enfin, il ne montre pas MessageBox Alors, quelque chose ne va pas ici?

Je pense qu'il ne trouve tout simplement pas cette fonction.

16
Rocketq

C'est assez simple:

Ajouter la propriété "Exit" à la balise d'application

<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>

et le gérer dans le "code derrière"

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

L'événement Exit est déclenché lorsque l'application s'arrête ou que la session Windows se termine. Il est déclenché après l'événement SessionEnding. Vous ne pouvez pas annuler l'événement Quitter.

43
Ofir

vous devez ajouter app_exit dans votre code xaml

 <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>

vous pouvez simplement accrocher l'événement Closing sur votre fenêtre principale comme ceci -

 <Window Closing="Window_Closing">

Et dans votre événement, faites tout le travail dont vous avez besoin

    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);
            }
}
13
BRAHIM Kamel

Si vous souhaitez suivre le principe MVVM, vous pouvez utiliser 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.
    }
}

Cette approche est plus testable. Bonne journée.

1
Jouan Antoine
  1. Assurez-vous que l'espace de noms (MyApp) correspond à "x: Class = MyApp ..."
  2. Sous les propriétés de <Application></Application>, double-cliquez sur la zone de texte à côté de "Quitter".
  3. Si vous obtenez "Impossible d'ajouter un gestionnaire d'événements", la reconstruction du projet l'a corrigé pour moi.

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 derrière

using System.Windows;

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