Как использовать Application.Exit Event в WPF?
Мне нужно удалить некоторые определенные файлы, затем пользователь закрывает программу в WPF. Поэтому я попробовал код MDSN отсюда http://msdn.microsoft.com/en-us/library/system.windows.application.exit.aspx следующим образом:
этот код находится здесь 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>
Во-первых, он не удаляет файлы, во-вторых, эта программа остается в процессе после того, как я нажал кнопку выхода (это действительно странно). Этот код не дает никаких ошибок. И, наконец, это не показывает MessageBox
Так что здесь не так?
Я думаю, что он просто не может найти эту функцию.
3 ответа
Все довольно просто:
Добавить свойство "Выход" в тег приложения
<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>
и обрабатывать это в "код позади"
private void Application_Exit(object sender, ExitEventArgs e)
{
// Perform tasks at application exit
}
Событие Exit вызывается, когда приложение закрывается или сеанс Windows заканчивается. Он запускается после события SessionEnding. Вы не можете отменить событие Exit.
Вы должны добавить app_exit в свой код 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>
Вы можете просто подключить событие Closing в главном окне, как это -
<Window Closing="Window_Closing">
И в вашем случае сделайте всю работу, которая вам нужна
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);
}
}
Если вам не нравится добавлять событие Exit в XAML, вы можете попробовать эту альтернативу.
Добавьте следующий метод в свой App.xaml.cs
:
protected override void OnExit(ExitEventArgs e)
{
base.OnExit(e);
// Your code here
}
Если вы хотите следовать принципу MVVM, вы можете использовать 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.
}
}
Этот подход более тестируем. Хорошего дня.
- Убедитесь, что пространство имен (MyApp) соответствует "x:Class=MyApp..."
- Под свойства для
<Application></Application>
дважды щелкните на текстовом поле рядом с "Выход". - Если вы получили "Невозможно добавить обработчик событий", тогда "Перестройка проекта" исправила это для меня.
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"
>
Код позади
using System.Windows;
namespace MyApp
{
public partial class App : Application
{
private void Application_Exit(object sender, ExitEventArgs e)
{
//your code
}
}
}