События класса Application

79

Изначально файл App.xaml.cs кода не содержит. Хотя какой-либо код не обязателен, можно добавить код обработки событий приложения. Класс Application предоставляет небольшой набор полезных событий. Ниже перечислены наиболее важные из них (здесь опущены события, используемые только в приложениях с навигацией):

Startup

Происходит после вызова метода Application.Run() и непосредственно перед отображением главного окна (если вы передаете главное окно методу Run())

Exit

Происходит, когда приложение останавливается по любой причине, непосредственно перед возвратом из метода Run(). В этот момент отменить останов нельзя, хотя код метода Main() может повторно запустить приложение. Событие Exit можно использовать для установки целочисленного кода выхода, возвращаемого методом Run().

SessionEnding

Происходит по завершении сеанса Windows, например, когда пользователь выходит из системы или выключает компьютер. (Выяснить, что конкретно произошло, позволяет свойство SessionEndingCancelEventArgs.ReasonSessionEnding.) Также можно отменить останов, присвоив SessionEndingCancelEventArgs.Cancel значение true. Если этого не делать, то WPF вызовет метод Application.Shutdown() по завершении обработчика события.

Activated

Происходит, когда активизируется одно из окон приложения. Это случается, когда вы переключаетесь с другой программы Windows на это приложение. Также случается при первом показе окна.

Deactivated

Происходит при деактивизации окна приложения. Случается, когда вы переключаетесь на другую программу Windows.

DispatcherUnhandledException

Происходит, когда возникает необработанное исключение в любом месте приложения (в главном потоке приложения). (Эти исключения перехватывает диспетчер приложения) При реакции на это событие можно протоколировать критичные ошибки, можно даже нейтрализовать исключение и продолжить работу приложения, установив свойство DispatcherUnhandledExceptionEventArgs.Handled в true. Такой шаг должен предприниматься только при достаточной уверенности в том, что приложение находится в корректном состоянии и его работа может быть продолжена.

При обработке событий доступны два выбора: присоединение обработчика событий или переопределение соответствующего защищенного метода. Если вы предпочитаете обрабатывать события приложения, то не нужно использовать код делегата для привязки его в качестве обработчика. Вместо этого его можно присоединить с помощью атрибута в файле App.xml. Например, если имеется следующий обработчик событий:

public partial class App : Application
{
     private void Application_DispatcherUnhandledException(object sender, 
            System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
     {
         MessageBox.Show("Исключение " + e.Exception.GetType().ToString() + " отключено");
         e.Handled = true;
     }
}

можно подключить его посредством такого XAML-кода:

<Application x:Class="WpfApplication1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml" 
             DispatcherUnhandledException="Application_DispatcherUnhandledException">
    <Application.Resources></Application.Resources>
</Application>

Для инициализации каждого события приложения вызывается соответствующий метод. Имя метода совпадает с именем события, но с добавлением префикса On, так что Startup становится OnStartup(), Exit — OnExit() и т.д. Этот шаблон чрезвычайно широко распространен в .NET (и программисты Windows Forms также его узнают). Единственным исключением является событие DispatcherExceptionUnhandled — метода OnDispatcherExceptionUnhandled не существует, так что для этого события должен всегда применяться обработчик.

При переопределении методов приложения будет хорошей идеей начинать с вызова реализации базового класса. Обычно реализация базового класса мало что делает помимо инициализации соответствующего события приложения.

Очевидно, что более сложная реализация этой техники должна отображать не окно сообщения, а некоторого рода диалоговое окно подтверждения, которое даст пользователю возможность выбора — продолжить (и выйти из приложения и Windows) либо отменить останов.

Пройди тесты
Лучший чат для C# программистов