Общие сведения об управлении приложениемApplication Management Overview

Все приложения имеют тенденцию совместно использовать общий набор функциональных возможностей, который применяется к реализации приложения и управлению им.All applications tend to share a common set of functionality that applies to application implementation and management. В этом разделе приводятся общие сведения о функциональных возможностях Application класса для создания приложений и управления ими.This topic provides an overview of the functionality in the Application class for creating and managing applications.

Класс ApplicationThe Application Class

В WPF общие функциональные возможности с областью действия приложения инкапсулированы в Application классе.In WPF, common application-scoped functionality is encapsulated in the Application class. ApplicationКласс включает следующие функциональные возможности:The Application class includes the following functionality:

  • отслеживание и взаимодействие со временем существования приложения;Tracking and interacting with application lifetime.

  • извлечение и обработка параметров командной строки;Retrieving and processing command-line parameters.

  • обнаружение необработанных исключений и реагирование на них;Detecting and responding to unhandled exceptions.

  • совместное использование свойств области определения приложения и ресурсов;Sharing application-scope properties and resources.

  • управление окнами в автономных приложениях;Managing windows in standalone applications.

  • отслеживание навигации и управление ею.Tracking and managing navigation.

Выполнение стандартных задач с помощью класса приложенияHow to Perform Common Tasks Using the Application Class

Если вы не заинтересованы в подробностях Application класса, в следующей таблице перечислены некоторые распространенные задачи для Application и способы их выполнения.If you are not interested in all of the details of the Application class, the following table lists some of the common tasks for Application and how to accomplish them. Чтобы получить дополнительные сведения и образец кода, просмотрите связанные API и разделы.By viewing the related API and topics, you can find more information and sample code.

ЗадачаTask ПодходApproach
Получение объекта, представляющего текущее приложениеGet an object that represents the current application Используйте свойство Application.Current.Use the Application.Current property.
Добавление заставки в приложениеAdd a startup screen to an application См. раздел Добавление экрана-заставки в приложение WPF.See Add a Splash Screen to a WPF Application.
Запуск приложенияStart an application Используйте метод Application.Run.Use the Application.Run method.
Остановка приложенияStop an application Используйте Shutdown метод Application.Current объекта.Use the Shutdown method of the Application.Current object.
Получение аргументов из командной строкиGet arguments from the command line Обработайте Application.Startup событие и используйте StartupEventArgs.Args свойство.Handle the Application.Startup event and use the StartupEventArgs.Args property. Пример см. в описании Application.Startup события.For an example, see the Application.Startup event.
Получение и задание кода завершения приложенияGet and set the application exit code Задайте ExitEventArgs.ApplicationExitCode свойство в Application.Exit обработчике событий или вызовите Shutdown метод и передайте целое число.Set the ExitEventArgs.ApplicationExitCode property in the Application.Exit event handler or call the Shutdown method and pass in an integer.
Обнаружение необработанных исключений и реагирование на нихDetect and respond to unhandled exceptions Обработайте DispatcherUnhandledException событие.Handle the DispatcherUnhandledException event.
Получение и задание ресурсов области определения приложенияGet and set application-scoped resources Используйте свойство Application.Resources.Use the Application.Resources property.
Использование словаря ресурсов области определения приложенияUse an application-scope resource dictionary См. раздел Использование словаря ресурсов Application-Scope.See Use an Application-Scope Resource Dictionary.
Получение и задание свойств области определения приложенияGet and set application-scoped properties Используйте свойство Application.Properties.Use the Application.Properties property.
Получение и сохранение состояния приложенияGet and save an application's state См. раздел Сохранение и восстановление Application-Scope свойств в сеансах приложения.See Persist and Restore Application-Scope Properties Across Application Sessions.
Управление файлами данных без кода, включая файлы ресурсов, файлы содержимого и файлы исходного сайта.Manage non-code data files, including resource files, content files, and site-of-origin files. См. раздел ресурс приложения WPF, содержимое и файлы данных.See WPF Application Resource, Content, and Data Files.
Управление окнами в автономных приложенияхManage windows in standalone applications См. раздел Общие сведения об окнах WPF.See WPF Windows Overview.
Отслеживание навигации и управление еюTrack and manage navigation См. раздел Общие сведения о навигации.See Navigation Overview.

Определение приложенияThe Application Definition

Чтобы использовать функциональные возможности Application класса, необходимо реализовать определение приложения.To utilize the functionality of the Application class, you must implement an application definition. Определение приложения WPF — это класс, производный от Application и настроенный с помощью специального параметра MSBuild.A WPF application definition is a class that derives from Application and is configured with a special MSBuild setting.

Реализация определения приложенияImplementing an Application Definition

Типичное определение приложения WPF реализуется с помощью разметки и кода программной части.A typical WPF application definition is implemented using both markup and code-behind. Это позволяет использовать разметку для декларативного задания свойств и ресурсов приложения и регистрации событий, а обработку событий и поведение приложения реализовывать в коде программной части.This allows you to use markup to declaratively set application properties, resources, and register events, while handling events and implementing application-specific behavior in code-behind.

В следующем примере показано, как реализовать определение приложения с помощью разметки и кода программной части:The following example shows how to implement an application definition using both markup and code-behind:

<Application 
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
  x:Class="SDKSample.App" />
using System.Windows;

namespace SDKSample
{
    public partial class App : Application { }
}

Imports System.Windows

Namespace SDKSample
    Partial Public Class App
        Inherits Application
    End Class
End Namespace

Для совместной работы файла разметки и файла кода программной части должны выполняться указанные ниже условия.To allow a markup file and code-behind file to work together, the following needs to happen:

  • В разметке Application элемент должен включать x:Class атрибут.In markup, the Application element must include the x:Class attribute. При сборке приложения существование x:Class в файле разметки приводит к тому, что MSBuild создает partial класс, производный от, Application и имеет имя, заданное x:Class атрибутом.When the application is built, the existence of x:Class in the markup file causes MSBuild to create a partial class that derives from Application and has the name that is specified by the x:Class attribute. Для этого требуется добавить объявление пространства имен XML для схемы XAML ( xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" ).This requires the addition of an XML namespace declaration for the XAML schema (xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml").

  • В коде программной части класс должен быть partial классом с тем же именем, которое задано x:Class атрибутом в разметке и должен быть производным от Application .In code-behind, the class must be a partial class with the same name that is specified by the x:Class attribute in markup and must derive from Application. Это позволяет связать файл кода программной части с partial классом, созданным для файла разметки при сборке приложения (см. раздел Создание приложения WPF).This allows the code-behind file to be associated with the partial class that is generated for the markup file when the application is built (see Building a WPF Application).

Примечание

При создании нового проекта приложения WPF или проекта приложения браузера WPF с помощью Visual Studio определение приложения включается по умолчанию и определяется с помощью разметки и кода программной части.When you create a new WPF Application project or WPF Browser Application project using Visual Studio, an application definition is included by default and is defined using both markup and code-behind.

Этот код является минимумом, необходимым для реализации определения приложения.This code is the minimum that is required to implement an application definition. Однако перед сборкой и запуском приложения необходимо внести в определение приложения дополнительную конфигурацию MSBuild.However, an additional MSBuild configuration needs to be made to the application definition before building and running the application.

Настройка определения приложения для MSBuildConfiguring the Application Definition for MSBuild

Для работы автономных приложений и приложений браузера XAML (XBAP) требуется реализация определенного уровня инфраструктуры.Standalone applications and XAML browser applications (XBAPs) require the implementation of a certain level of infrastructure before they can run. Наиболее важной частью этой инфраструктуры является точка входа.The most important part of this infrastructure is the entry point. При запуске приложения пользователем операционная система вызывает точку входа, которая является известной функцией для запуска приложений.When an application is launched by a user, the operating system calls the entry point, which is a well-known function for starting applications.

Обычно разработчикам требовалось писать весь этот код или его часть самостоятельно в зависимости от технологии.Traditionally, developers have needed to write some or all of this code for themselves, depending on the technology. Однако WPF создает этот код, если файл разметки определения приложения настроен в качестве ApplicationDefinition элемента MSBuild, как показано в следующем файле проекта MSBuild:However, WPF generates this code for you when the markup file of your application definition is configured as an MSBuild ApplicationDefinition item, as shown in the following MSBuild project file:

<Project
  DefaultTargets="Build"
                        xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  ...
  <ApplicationDefinition Include="App.xaml" />
  <Compile Include="App.xaml.cs" />
  ...
</Project>

Поскольку файл кода программной части содержит код, он помечается как Compile элемент MSBuild, как обычная.Because the code-behind file contains code, it is marked as an MSBuild Compile item, as is normal.

Применение этих конфигураций MSBuild к файлам разметки и кода программной части определения приложения приводит к тому, что MSBuild создает код, подобный следующему:The application of these MSBuild configurations to the markup and code-behind files of an application definition causes MSBuild to generate code like the following:

using System;
using System.Windows;

namespace SDKSample
{
    public class App : Application
    {
        public App() { }
        [STAThread]
        public static void Main()
        {
            // Create new instance of application subclass
            App app = new App();

            // Code to register events and set properties that were
            // defined in XAML in the application definition
            app.InitializeComponent();

            // Start running the application
            app.Run();
        }

        public void InitializeComponent()
        {
            // Initialization code goes here.
        }
    }
}
Imports System.Windows

Namespace SDKSample
    Public Class App
        Inherits Application
        Public Sub New()
        End Sub
        <STAThread>
        Public Shared Sub Main()
            ' Create new instance of application subclass
            Dim app As New App()

            ' Code to register events and set properties that were
            ' defined in XAML in the application definition
            app.InitializeComponent()

            ' Start running the application
            app.Run()
        End Sub

        Public Sub InitializeComponent()
            ' Initialization code goes here.	
        End Sub
    End Class
End Namespace

Результирующий код дополняет определение приложения с помощью дополнительного кода инфраструктуры, который включает в себя метод точки входа Main .The resulting code augments your application definition with additional infrastructure code, which includes the entry-point method Main. STAThreadAttributeАтрибут применяется к Main методу, чтобы указать, что основной поток пользовательского интерфейса для приложения WPF является потоком STA, который необходим для приложений WPF.The STAThreadAttribute attribute is applied to the Main method to indicate that the main UI thread for the WPF application is an STA thread, which is required for WPF applications. При вызове Main метод создает новый экземпляр класса App перед вызовом InitializeComponent метода для регистрации событий и задания свойств, которые реализуются в разметке.When called, Main creates a new instance of App before calling the InitializeComponent method to register the events and set the properties that are implemented in markup. Поскольку InitializeComponent создается автоматически, вам не нужно явно вызывать InitializeComponent из определения приложения, как Page и для Window реализаций.Because InitializeComponent is generated for you, you don't need to explicitly call InitializeComponent from an application definition like you do for Page and Window implementations. Наконец, Run вызывается метод для запуска приложения.Finally, the Run method is called to start the application.

Получение текущего приложенияGetting the Current Application

Поскольку функциональные возможности Application класса являются общими для приложения, в каждый из них может быть только один экземпляр Application класса AppDomain .Because the functionality of the Application class are shared across an application, there can be only one instance of the Application class per AppDomain. Для этого Application класс реализуется как одноэлементный класс (см. реализацию Singleton в C#), который создает единственный экземпляр и предоставляет общий доступ к нему со static Current свойством.To enforce this, the Application class is implemented as a singleton class (see Implementing Singleton in C#), which creates a single instance of itself and provides shared access to it with the staticCurrent property.

В следующем коде показано, как получить ссылку на Application объект для текущего объекта AppDomain .The following code shows how to acquire a reference to the Application object for the current AppDomain.

// Get current application
Application current = App.Current;
' Get current application
Dim current As Application = App.Current

Current Возвращает ссылку на экземпляр Application класса.Current returns a reference to an instance of the Application class. Если требуется ссылка на Application производный класс, необходимо привести значение Current свойства, как показано в следующем примере.If you want a reference to your Application derived class you must cast the value of the Current property, as shown in the following example.

// Get strongly-typed current application
App app = (App)App.Current;
' Get strongly-typed current application
Dim appCurrent As App = CType(App.Current, App)

Значение можно проверить в Current любой момент времени существования Application объекта.You can inspect the value of Current at any point in the lifetime of an Application object. Однако следует соблюдать осторожность.However, you should be careful. После Application создания экземпляра класса существует период, в течение которого состояние Application объекта не согласовано.After the Application class is instantiated, there is a period during which the state of the Application object is inconsistent. В течение этого периода времени выполняет Application различные задачи инициализации, необходимые для выполнения кода, включая установку инфраструктуры приложений, настройку свойств и регистрацию событий.During this period, Application is performing the various initialization tasks that are required by your code to run, including establishing application infrastructure, setting properties, and registering events. Если вы попытаетесь использовать Application объект в течение этого периода, код может иметь непредвиденные результаты, особенно если он зависит от различных Application заданных свойств.If you try to use the Application object during this period, your code may have unexpected results, particularly if it depends on the various Application properties being set.

Когда Application завершает работу инициализации, действительно начинается его время существования.When Application completes its initialization work, its lifetime truly begins.

Время существования приложенияApplication Lifetime

Время существования приложения WPF помечается несколькими событиями, которые вызываются, Application чтобы сообщить, когда приложение запущено, было активировано и отключено, а также было завершено.The lifetime of a WPF application is marked by several events that are raised by Application to let you know when your application has started, has been activated and deactivated, and has been shut down.

ЗаставкаSplash Screen

Начиная с платформа .NET Framework 3,5 с пакетом обновления 1 (SP1), можно указать изображение, которое будет использоваться в окне запуска или на экране-заставке.Starting in the .NET Framework 3.5 SP1, you can specify an image to be used in a startup window, or splash screen. SplashScreenКласс позволяет легко отображать окно запуска во время загрузки приложения.The SplashScreen class makes it easy to display a startup window while your application is loading. SplashScreenОкно создается и отображается перед Run вызовом метода.The SplashScreen window is created and shown before Run is called. Дополнительные сведения см. в статьях время запуска приложения и Добавление экрана-ЗАСТАВКИ в приложение WPF.For more information, see Application Startup Time and Add a Splash Screen to a WPF Application.

Запуск приложенияStarting an Application

После Run вызова и инициализации приложения приложение готово к выполнению.After Run is called and the application is initialized, the application is ready to run. Этот момент означает, что Startup возникает событие:This moment is signified when the Startup event is raised:

using System.Windows;

namespace SDKSample
{
    public partial class App : Application
    {
        void App_Startup(object sender, StartupEventArgs e)
        {
            // Application is running
        }
    }
}

Namespace SDKSample
    Partial Public Class App
        Inherits Application
        Private Sub App_Startup(ByVal sender As Object, ByVal e As StartupEventArgs)
            ' Application is running
            '</SnippetStartupCODEBEHIND1>
    End Class
End Namespace
'</SnippetStartupCODEBEHIND2>

На этом этапе существования приложения наиболее распространенной особенностью является отображение пользовательского интерфейса.At this point in an application's lifetime, the most common thing to do is to show a UI.

Отображение пользовательского интерфейсаShowing a User Interface

Большинство автономных приложений Windows открывают, Window когда они начинают работать.Most standalone Windows applications open a Window when they begin running. StartupОбработчик событий — это одно из расположений, из которого можно сделать это, как показано в следующем коде.The Startup event handler is one location from which you can do this, as demonstrated by the following code.

<Application
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="SDKSample.App" 
  Startup="App_Startup" />
using System.Windows;

namespace SDKSample
{
    public partial class App : Application
    {
        void App_Startup(object sender, StartupEventArgs e)
        {
            // Open a window
            MainWindow window = new MainWindow();
            window.Show();
        }
    }
}

Imports System.Windows

Namespace SDKSample
    Partial Public Class App
        Inherits Application
        Private Sub App_Startup(ByVal sender As Object, ByVal e As StartupEventArgs)
            ' Open a window
            Dim window As New MainWindow()
            window.Show()
        End Sub
    End Class
End Namespace

Примечание

Первый экземпляр, создаваемый Window в автономном приложении, по умолчанию превращается в основное окно приложения.The first Window to be instantiated in a standalone application becomes the main application window by default. WindowНа этот объект ссылается Application.MainWindow свойство.This Window object is referenced by the Application.MainWindow property. Значение MainWindow свойства может быть изменено программным образом, если другое окно, отличное от первого экземпляра, Window должно быть основным окном.The value of the MainWindow property can be changed programmatically if a different window than the first instantiated Window should be the main window.

При первом запуске XBAP, скорее всего, будет выполнен переход к Page .When an XBAP first starts, it will most likely navigate to a Page. Это показано в приведенном ниже коде.This is shown in the following code.

<Application 
  x:Class="SDKSample.App"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  Startup="App_Startup" />
using System;
using System.Windows;
using System.Windows.Navigation;

namespace SDKSample
{
    public partial class App : Application
    {
        void App_Startup(object sender, StartupEventArgs e)
        {
            ((NavigationWindow)this.MainWindow).Navigate(new Uri("HomePage.xaml", UriKind.Relative));
        }
    }
}

Imports System.Windows
Imports System.Windows.Navigation

Namespace SDKSample
    Partial Public Class App
        Inherits Application
        Private Sub App_Startup(ByVal sender As Object, ByVal e As StartupEventArgs)
            CType(Me.MainWindow, NavigationWindow).Navigate(New Uri("HomePage.xaml", UriKind.Relative))
        End Sub
    End Class
End Namespace

Если вы обрабатываете Startup только открытие Window или переход к Page , можно задать StartupUri атрибут в разметке.If you handle Startup to only open a Window or navigate to a Page, you can set the StartupUri attribute in markup instead.

В следующем примере показано, как использовать StartupUri из автономного приложения для открытия Window .The following example shows how to use the StartupUri from a standalone application to open a Window.

<Application
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    StartupUri="MainWindow.xaml" />

В следующем примере показано, как использовать StartupUri из XBAP для перехода к Page .The following example shows how to use StartupUri from an XBAP to navigate to a Page.

<Application
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    StartupUri="HomePage.xaml" />

Эта разметка действует так же, как и предыдущий код для открытия окна.This markup has the same effect as the previous code for opening a window.

Примечание

Дополнительные сведения о навигации см. в разделе Общие сведения о навигации.For more information on navigation, see Navigation Overview.

Необходимо обработать Startup событие, чтобы открыть, если необходимо Window создать его экземпляр с помощью конструктора без параметров, или необходимо задать его свойства или подписываться на его события перед отображением, или необходимо обработать аргументы командной строки, которые были предоставлены при запуске приложения.You need to handle the Startup event to open a Window if you need to instantiate it using a non-parameterless constructor, or you need to set its properties or subscribe to its events before showing it, or you need to process any command-line arguments that were supplied when the application was launched.

Обработка аргументов командной строкиProcessing Command-Line Arguments

В Windows автономные приложения можно запускать из командной строки или с рабочего стола.In Windows, standalone applications can be launched from either a command prompt or the desktop. В обоих случаях аргументы командной строки могут быть переданы приложению.In both cases, command-line arguments can be passed to the application. В приведенном ниже примере показано приложение, которое запускается с одним аргументом командной строки /StartMinimized:The following example shows an application that is launched with a single command-line argument, "/StartMinimized":

wpfapplication.exe /StartMinimized

Во время инициализации приложения WPF получает аргументы командной строки из операционной системы и передает их Startup обработчику событий через Args свойство StartupEventArgs параметра.During application initialization, WPF retrieves the command-line arguments from the operating system and passes them to the Startup event handler via the Args property of the StartupEventArgs parameter. Аргументы командной строки можно извлечь и сохранить с помощью приведенного ниже кода.You can retrieve and store the command-line arguments using code like the following.

<Application
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="SDKSample.App"
  Startup="App_Startup" />
using System.Windows;

namespace SDKSample
{
    public partial class App : Application
    {
        void App_Startup(object sender, StartupEventArgs e)
        {
            // Application is running
            // Process command line args
            bool startMinimized = false;
            for (int i = 0; i != e.Args.Length; ++i)
            {
                if (e.Args[i] == "/StartMinimized")
                {
                    startMinimized = true;
                }
            }

            // Create main application window, starting minimized if specified
            MainWindow mainWindow = new MainWindow();
            if (startMinimized)
            {
                mainWindow.WindowState = WindowState.Minimized;
            }
            mainWindow.Show();
        }
    }
}

Imports System.Windows

Namespace SDKSample
    Partial Public Class App
        Inherits Application
        Private Sub App_Startup(ByVal sender As Object, ByVal e As StartupEventArgs)
            ' Application is running
            ' Process command line args
            Dim startMinimized As Boolean = False
            Dim i As Integer = 0
            Do While i <> e.Args.Length
                If e.Args(i) = "/StartMinimized" Then
                    startMinimized = True
                End If
                i += 1
            Loop

            ' Create main application window, starting minimized if specified
            Dim mainWindow As New MainWindow()
            If startMinimized Then
                mainWindow.WindowState = WindowState.Minimized
            End If
            mainWindow.Show()
        End Sub
    End Class
End Namespace

Код обрабатывает, Startup чтобы проверить, предоставлен ли аргумент командной строки /StartMinimized . Если да, то он открывает главное окно с параметром WindowState Minimized .The code handles Startup to check whether the /StartMinimized command-line argument was provided; if so, it opens the main window with a WindowState of Minimized. Обратите внимание, что поскольку WindowState свойство должно быть задано программно, главное Window необходимо открыть в коде явным образом.Note that because the WindowState property must be set programmatically, the main Window must be opened explicitly in code.

XBAP не могут извлекать и обрабатывать аргументы командной строки, так как они запускаются с помощью развертывания ClickOnce (см. раздел развертывание приложения WPF).XBAPs cannot retrieve and process command-line arguments because they are launched using ClickOnce deployment (see Deploying a WPF Application). Однако они могут извлекать и обрабатывать строковые параметры запроса из URL-адресов, которые используются для их запуска.However, they can retrieve and process query string parameters from the URLs that are used to launch them.

Активация и отключение приложенияApplication Activation and Deactivation

Windows позволяет пользователям переключаться между приложениями.Windows allows users to switch between applications. Наиболее простой способ — использовать клавиши ALT+TAB.The most common way is to use the ALT+TAB key combination. Приложение может быть переключено на, только если оно видимо Window , которое пользователь может выбрать.An application can only be switched to if it has a visible Window that a user can select. Выбранный в данный момент объект Window является активным окном (также известным как окно переднего плана) и — это объект Window , который получает входные данные пользователя.The currently selected Window is the active window (also known as the foreground window) and is the Window that receives user input. Приложение с активным окном — это активное приложение (или Приложение переднего плана).The application with the active window is the active application (or foreground application). Приложение становится активным в указанных ниже случаях.An application becomes the active application in the following circumstances:

  • Он запускается и отображает Window .It is launched and shows a Window.

  • Пользователь переключается из другого приложения, выбирая Window в приложении.A user switches from another application by selecting a Window in the application.

Можно определить, когда приложение станет активным, обрабатывая Application.Activated событие.You can detect when an application becomes active by handling the Application.Activated event.

Аналогичным образом приложение может стать неактивным в указанных ниже случаях.Likewise, an application can become inactive in the following circumstances:

  • Пользователь переключается на другое приложение из текущего.A user switches to another application from the current one.

  • Приложение завершает работу.When the application shuts down.

Можно определить, когда приложение станет неактивным, обрабатывая Application.Deactivated событие.You can detect when an application becomes inactive by handling the Application.Deactivated event.

В следующем коде показано, как управлять Activated Deactivated событиями и, чтобы определить, является ли приложение активным.The following code shows how to handle the Activated and Deactivated events to determine whether an application is active.

<Application 
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="SDKSample.App"
  StartupUri="MainWindow.xaml"
  Activated="App_Activated" 
  Deactivated="App_Deactivated" />
using System;
using System.Windows;

namespace SDKSample
{
    public partial class App : Application
    {
        bool isApplicationActive;

        void App_Activated(object sender, EventArgs e)
        {
            // Application activated
            this.isApplicationActive = true;
        }

        void App_Deactivated(object sender, EventArgs e)
        {
            // Application deactivated
            this.isApplicationActive = false;
        }
    }
}

Imports System.Windows

Namespace SDKSample
    Partial Public Class App
        Inherits Application
        Private isApplicationActive As Boolean

        Private Sub App_Activated(ByVal sender As Object, ByVal e As EventArgs)
            ' Application activated
            Me.isApplicationActive = True
        End Sub

        Private Sub App_Deactivated(ByVal sender As Object, ByVal e As EventArgs)
            ' Application deactivated
            Me.isApplicationActive = False
        End Sub
    End Class
End Namespace

WindowМожно также активировать и деактивировать.A Window can also be activated and deactivated. Дополнительные сведения см. в разделах Window.Activated и Window.Deactivated.See Window.Activated and Window.Deactivated for more information.

Примечание

Application.Activated Application.Deactivated Для XBAP не вызывается ни, ни.Neither Application.Activated nor Application.Deactivated is raised for XBAPs.

Завершение работы приложенияApplication Shutdown

Время существования приложения заканчивается, когда оно завершает работу, что может возникнуть по указанным ниже причинам.The life of an application ends when it is shut down, which can occur for the following reasons:

  • Пользователь закрывает каждое Window .A user closes every Window.

  • Пользователь закрывает основной Window .A user closes the main Window.

  • Пользователь завершает сеанс Windows, выполнив выход из системы или завершая его работу.A user ends the Windows session by logging off or shutting down.

  • Выполнено специальное условие для приложения.An application-specific condition has been met.

Чтобы упростить управление завершением работы приложения, Application предоставляет Shutdown метод, ShutdownMode свойство и SessionEnding Exit события и.To help you manage application shutdown, Application provides the Shutdown method, the ShutdownMode property, and the SessionEnding and Exit events.

Примечание

Shutdown может вызываться только из приложений, имеющих UIPermission .Shutdown can only be called from applications that have UIPermission. Это разрешение всегда имеет автономные приложения WPF.Standalone WPF applications always have this permission. Однако XBAP, работающие в изолированной среде безопасности с частичным доверием зоны Интернета, не имеют.However, XBAPs running in the Internet zone partial-trust security sandbox do not.

Режим завершения работыShutdown Mode

Большинство приложений завершают работу при закрытии главного окна или всех окон.Most applications shut down either when all the windows are closed or when the main window is closed. Иногда, однако, другие условия конкретного приложения могут определить, когда приложение завершает работу.Sometimes, however, other application-specific conditions may determine when an application shuts down. Можно указать условия, при которых приложение будет закрыто, задав ShutdownMode одно из следующих ShutdownMode значений перечисления:You can specify the conditions under which your application will shut down by setting ShutdownMode with one of the following ShutdownMode enumeration values:

Значение по умолчанию ShutdownModeOnLastWindowClose , то есть приложение автоматически завершает работу при закрытии пользователем последнего окна в приложении.The default value of ShutdownMode is OnLastWindowClose, which means that an application automatically shuts down when the last window in the application is closed by the user. Однако если при закрытии главного окна приложение должно завершить работу, WPF автоматически делает это, если задано значение ShutdownMode OnMainWindowClose .However, if your application should be shut down when the main window is closed, WPF automatically does that if you set ShutdownMode to OnMainWindowClose. Это показано в следующем примере.This is shown in the following example.

<Application
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.App"
    ShutdownMode="OnMainWindowClose" />

При наличии условий завершения работы, зависящих от приложения, устанавливается ShutdownMode значение OnExplicitShutdown .When you have application-specific shutdown conditions, you set ShutdownMode to OnExplicitShutdown. В этом случае вы отвечаете за завершение работы приложения путем явного вызова Shutdown метода. в противном случае приложение продолжит работать, даже если все окна закрыты.In this case, it is your responsibility to shut an application down by explicitly calling the Shutdown method; otherwise, your application will continue running even if all the windows are closed. Обратите внимание, что Shutdown вызывается неявно, если ShutdownMode имеет значение OnLastWindowClose или OnMainWindowClose .Note that Shutdown is called implicitly when the ShutdownMode is either OnLastWindowClose or OnMainWindowClose.

Примечание

ShutdownMode может быть задано из XBAP, но игнорируется; XBAP всегда завершает работу при переходе из в браузере или при закрытии браузера, на котором размещается XBAP.ShutdownMode can be set from an XBAP, but it is ignored; an XBAP is always shut down when it is navigated away from in a browser or when the browser that hosts the XBAP is closed. Дополнительные сведения см. в разделе Общие сведения о навигации.For more information, see Navigation Overview.

Завершение сеансаSession Ending

Условия завершения работы, описанные ShutdownMode свойством, относятся к приложению.The shutdown conditions that are described by the ShutdownMode property are specific to an application. Однако в некоторых случаях приложение может завершить работу в результате выполнения внешнего условия.In some cases, though, an application may shut down as a result of an external condition. Наиболее распространенное внешнее условие возникает, когда пользователь завершает сеанс Windows с помощью следующих действий:The most common external condition occurs when a user ends the Windows session by the following actions:

  • выход из системы;Logging off

  • завершение работы;Shutting down

  • перезапуск;Restarting

  • спящий режим.Hibernating

Чтобы определить время завершения сеанса Windows, можно выполнить обработку SessionEnding события, как показано в следующем примере.To detect when a Windows session ends, you can handle the SessionEnding event, as illustrated in the following example.

<Application 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.App"
    StartupUri="MainWindow.xaml"
    SessionEnding="App_SessionEnding" />
using System.Windows;

namespace SDKSample
{
    public partial class App : Application
    {
        void App_SessionEnding(object sender, SessionEndingCancelEventArgs e)
        {
            // Ask the user if they want to allow the session to end
            string msg = string.Format("{0}. End session?", e.ReasonSessionEnding);
            MessageBoxResult result = MessageBox.Show(msg, "Session Ending", MessageBoxButton.YesNo);

            // End session, if specified
            if (result == MessageBoxResult.No)
            {
                e.Cancel = true;
            }
        }
    }
}

Imports System.Windows

Namespace SDKSample
    Partial Public Class App
        Inherits Application
        Private Sub App_SessionEnding(ByVal sender As Object, ByVal e As SessionEndingCancelEventArgs)
            ' Ask the user if they want to allow the session to end
            Dim msg As String = String.Format("{0}. End session?", e.ReasonSessionEnding)
            Dim result As MessageBoxResult = MessageBox.Show(msg, "Session Ending", MessageBoxButton.YesNo)

            ' End session, if specified
            If result = MessageBoxResult.No Then
                e.Cancel = True
            End If
        End Sub
    End Class
End Namespace

В этом примере код проверяет ReasonSessionEnding свойство, чтобы определить, как завершается сеанс Windows.In this example, the code inspects the ReasonSessionEnding property to determine how the Windows session is ending. Он использует это значение, чтобы отобразить сообщение подтверждения для пользователя.It uses this value to display a confirmation message to the user. Если пользователь не хочет, чтобы сеанс закончится, код задает для значение, чтобы Cancel true предотвратить завершение сеанса Windows.If the user does not want the session to end, the code sets Cancel to true to prevent the Windows session from ending.

Примечание

SessionEnding не вызывается для XBAP.SessionEnding is not raised for XBAPs.

ВыходExit

При завершении работы приложения может возникнуть необходимость выполнить окончательную обработку, например сохранение состояния приложения.When an application shuts down, it may need to perform some final processing, such as persisting application state. В таких ситуациях можно выполнить обработку Exit события, как это App_Exit делает обработчик событий в следующем примере.For these situations, you can handle the Exit event, as the App_Exit event handler does in the following example. Он определяется как обработчик событий в файле app. XAML .It is defined as an event handler in the App.xaml file. Его реализация выделяется в файлах app. XAML. CS и Application. XAML. vb .Its implementation is highlighted in the App.xaml.cs and Application.xaml.vb files.

<Application
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.App"
    StartupUri="MainWindow.xaml" 
    Startup="App_Startup" 
    Exit="App_Exit">
    <Application.Resources>
        <SolidColorBrush x:Key="ApplicationScopeResource" Color="White"></SolidColorBrush>
    </Application.Resources>
</Application>
using System.Windows;
using System.IO;
using System.IO.IsolatedStorage;

namespace SDKSample
{
    public partial class App : Application
    {
        string filename = "App.txt";

        public App()
        {
            // Initialize application-scope property
            this.Properties["NumberOfAppSessions"] = 0;
        }

        private void App_Startup(object sender, StartupEventArgs e)
        {
            // Restore application-scope property from isolated storage
            IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForDomain();
            try
            {
                using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(filename, FileMode.Open, storage))
                using (StreamReader reader = new StreamReader(stream))
                {
                    // Restore each application-scope property individually
                    while (!reader.EndOfStream)
                    {
                        string[] keyValue = reader.ReadLine().Split(new char[] {','});
                        this.Properties[keyValue[0]] = keyValue[1];
                    }
                }
            }
            catch (FileNotFoundException ex)
            {
                // Handle when file is not found in isolated storage:
                // * When the first application session
                // * When file has been deleted
            }
        }

        private void App_Exit(object sender, ExitEventArgs e)
        {
            // Persist application-scope property to isolated storage
            IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForDomain();
            using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(filename, FileMode.Create, storage))
            using (StreamWriter writer = new StreamWriter(stream))
            {
                // Persist each application-scope property individually
                foreach (string key in this.Properties.Keys)
                {
                    writer.WriteLine("{0},{1}", key, this.Properties[key]);
                }
            }
        }
    }
}
Imports System.IO
Imports System.IO.IsolatedStorage

Namespace SDKSample
    Partial Public Class App
        Inherits Application
        Private filename As String = "App.txt"

        Public Sub New()
            ' Initialize application-scope property
            Me.Properties("NumberOfAppSessions") = 0
        End Sub

        Private Sub App_Startup(ByVal sender As Object, ByVal e As StartupEventArgs)
            ' Restore application-scope property from isolated storage
            Dim storage As IsolatedStorageFile = IsolatedStorageFile.GetUserStoreForDomain()
            Try
                Using stream As New IsolatedStorageFileStream(filename, FileMode.Open, storage)
                Using reader As New StreamReader(stream)
                    ' Restore each application-scope property individually
                    Do While Not reader.EndOfStream
                        Dim keyValue() As String = reader.ReadLine().Split(New Char() {","c})
                        Me.Properties(keyValue(0)) = keyValue(1)
                    Loop
                End Using
                End Using
            Catch ex As FileNotFoundException
                ' Handle when file is not found in isolated storage:
                ' * When the first application session
                ' * When file has been deleted
            End Try
        End Sub

        Private Sub App_Exit(ByVal sender As Object, ByVal e As ExitEventArgs)
            ' Persist application-scope property to isolated storage
            Dim storage As IsolatedStorageFile = IsolatedStorageFile.GetUserStoreForDomain()
            Using stream As New IsolatedStorageFileStream(filename, FileMode.Create, storage)
            Using writer As New StreamWriter(stream)
                ' Persist each application-scope property individually
                For Each key As String In Me.Properties.Keys
                    writer.WriteLine("{0},{1}", key, Me.Properties(key))
                Next key
            End Using
            End Using
        End Sub
    End Class
End Namespace

Полный пример см. в разделе Сохранение и восстановление Application-Scope свойств в сеансах приложения.For the complete example, see Persist and Restore Application-Scope Properties Across Application Sessions.

Exit может обрабатываться как автономными приложениями, так и XBAP.Exit can be handled by both standalone applications and XBAPs. Для XBAP Exit вызывается в следующих случаях:For XBAPs, Exit is raised when in the following circumstances:

  • Выполняется переход к XBAP из.An XBAP is navigated away from.

  • В Internet Explorer, когда вкладка, на которой размещается XBAP, закрыта.In Internet Explorer, when the tab that is hosting the XBAP is closed.

  • Закрывается браузер.When the browser is closed.

Код завершенияExit Code

Приложения, как правило, запускаются операционной системой в ответ на запрос пользователя.Applications are mostly launched by the operating system in response to a user request. Однако приложение может быть запущено другим приложением для выполнения определенной задачи.However, an application can be launched by another application to perform some specific task. При завершении работы запущенного приложения приложению, которое его запустило, может понадобиться выяснить условие, при котором запущенное приложение завершает работу.When the launched application shuts down, the launching application may want to know the condition under which the launched application shut down. В таких ситуациях Windows позволяет приложениям возвращать код выхода приложения при завершении работы.In these situations, Windows allows applications to return an application exit code on shutdown. По умолчанию приложения WPF возвращают значение кода выхода 0.By default, WPF applications return an exit code value of 0.

Примечание

При отладке из Visual Studio код завершения приложения отображается в окне вывода при завершении работы приложения в сообщении, которое выглядит следующим образом:When you debug from Visual Studio, the application exit code is displayed in the Output window when the application shuts down, in a message that looks like the following:

The program '[5340] AWPFApp.vshost.exe: Managed' has exited with code 0 (0x0).

Чтобы открыть окно вывода , щелкните вывод в меню вид .You open the Output window by clicking Output on the View menu.

Чтобы изменить код выхода, можно вызвать Shutdown(Int32) перегрузку, которая принимает целочисленный аргумент в качестве кода выхода:To change the exit code, you can call the Shutdown(Int32) overload, which accepts an integer argument to be the exit code:

// Shutdown and return a non-default exit code
Application.Current.Shutdown(-1);
' Shutdown and return a non-default exit code
Application.Current.Shutdown(-1)

Можно определить значение кода выхода и изменить его, обрабатывая Exit событие.You can detect the value of the exit code, and change it, by handling the Exit event. ExitОбработчик событий передается, ExitEventArgs который предоставляет доступ к коду выхода со ApplicationExitCode свойством.The Exit event handler is passed an ExitEventArgs which provides access to the exit code with the ApplicationExitCode property. Дополнительные сведения см. в разделе Exit.For more information, see Exit.

Примечание

Код выхода можно задать как в автономных приложениях, так и в XBAP.You can set the exit code in both standalone applications and XBAPs. Однако значение кода выхода игнорируется для XBAP.However, the exit code value is ignored for XBAPs.

Необработанные исключенияUnhandled Exceptions

Иногда приложение может завершить работу из-за неправильного состояния, например когда создается непредвиденное исключение.Sometimes an application may shut down under abnormal conditions, such as when an unanticipated exception is thrown. В этом случае в приложении может не быть кода для обнаружения и обработки исключения.In this case, the application may not have the code to detect and process the exception. Исключение такого типа является необработанным. Перед закрытием приложения выводится уведомление, похожее на показанное на рисунке ниже.This type of exception is an unhandled exception; a notification similar to that shown in the following figure is displayed before the application is closed.

Снимок экрана, на котором показано уведомление о необработанном исключении.

С точки зрения работы пользователя такое поведение приложения по умолчанию лучше переопределить, выполнив некоторые или все следующие действия:From the user experience perspective, it is better for an application to avoid this default behavior by doing some or all of the following:

  • отображение понятных для пользователя сведений;Displaying user-friendly information.

  • попытка продолжить выполнение приложения;Attempting to keep an application running.

  • Запись подробных сведений об исключениях, понятных разработчикам, в журнале событий Windows.Recording detailed, developer-friendly exception information in the Windows event log.

Реализация этой поддержки зависит от возможности обнаружения необработанных исключений, DispatcherUnhandledException о которых вызывается событие.Implementing this support depends on being able to detect unhandled exceptions, which is what the DispatcherUnhandledException event is raised for.

<Application
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="SDKSample.App"
  StartupUri="MainWindow.xaml"
  DispatcherUnhandledException="App_DispatcherUnhandledException" />
using System.Windows;
using System.Windows.Threading;

namespace SDKSample
{
    public partial class App : Application
    {
        void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
        {
            // Process unhandled exception

            // Prevent default unhandled exception processing
            e.Handled = true;
        }
    }
}
Imports System.Windows
Imports System.Windows.Threading

Namespace SDKSample
    Partial Public Class App
        Inherits Application
        Private Sub App_DispatcherUnhandledException(ByVal sender As Object, ByVal e As DispatcherUnhandledExceptionEventArgs)
            ' Process unhandled exception

            ' Prevent default unhandled exception processing
            e.Handled = True
        End Sub
    End Class
End Namespace

DispatcherUnhandledExceptionОбработчику событий передается DispatcherUnhandledExceptionEventArgs параметр, содержащий контекстные сведения о необработанном исключении, включая само исключение ( DispatcherUnhandledExceptionEventArgs.Exception ).The DispatcherUnhandledException event handler is passed a DispatcherUnhandledExceptionEventArgs parameter that contains contextual information regarding the unhandled exception, including the exception itself (DispatcherUnhandledExceptionEventArgs.Exception). Эту информацию можно использовать для определения способа обработки исключений.You can use this information to determine how to handle the exception.

При обработке необходимо DispatcherUnhandledException задать DispatcherUnhandledExceptionEventArgs.Handled для свойства значение true ; в противном случае WPF по-прежнему считает исключение необработанным и вернется к поведению по умолчанию, описанному выше.When you handle DispatcherUnhandledException, you should set the DispatcherUnhandledExceptionEventArgs.Handled property to true; otherwise, WPF still considers the exception to be unhandled and reverts to the default behavior described earlier. Если возникает необработанное исключение и DispatcherUnhandledException событие не обрабатывается, или событие обрабатывается и Handled имеет значение false , приложение немедленно завершает работу.If an unhandled exception is raised and either the DispatcherUnhandledException event is not handled, or the event is handled and Handled is set to false, the application shuts down immediately. Кроме того, другие Application события не вызываются.Furthermore, no other Application events are raised. Следовательно, необходимо выполнить обработку, DispatcherUnhandledException Если в приложении есть код, который должен выполняться перед завершением работы приложения.Consequently, you need to handle DispatcherUnhandledException if your application has code that must run before the application shuts down.

Хотя приложение может завершить работу в результате возникновения необработанного исключения, приложение обычно завершает работу в ответ на запрос пользователя, как описано в следующем разделе.Although an application may shut down as a result of an unhandled exception, an application usually shuts down in response to a user request, as discussed in the next section.

Событий приложенияApplication Lifetime Events

Автономные приложения и XBAP не имеют точно одинакового времени существования.Standalone applications and XBAPs don't have exactly the same lifetimes. На приведенном ниже рисунке продемонстрированы ключевые события времени существования автономного приложения и показана последовательность, в которой они создаются.The following figure illustrates the key events in the lifetime of a standalone application and shows the sequence in which they are raised.

События автономного приложения - приложенияStandalone Application - Application Object Events

Аналогично, на следующем рисунке показаны ключевые события времени существования XBAP и показана последовательность, в которой они создаются.Likewise, the following figure illustrates the key events in the lifetime of an XBAP, and shows the sequence in which they are raised.

События объекта приложения XBAP -XBAP - Application Object Events

См. также разделSee also