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

Все приложения имеют тенденцию совместно использовать общий набор функциональных возможностей, который применяется к реализации приложения и управлению им. В этом разделе приводятся общие сведения о функциональных возможностях Application класса для создания приложений и управления ими.

Класс Application

В WPF общие функциональные возможности с областью действия приложения инкапсулированы в Application классе. ApplicationКласс включает следующие функциональные возможности:

  • отслеживание и взаимодействие со временем существования приложения;

  • извлечение и обработка параметров командной строки;

  • обнаружение необработанных исключений и реагирование на них;

  • совместное использование свойств области определения приложения и ресурсов;

  • управление окнами в автономных приложениях;

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

Выполнение стандартных задач с помощью класса приложения

Если вы не заинтересованы в подробностях Application класса, в следующей таблице перечислены некоторые распространенные задачи для Application и способы их выполнения. Чтобы получить дополнительные сведения и образец кода, просмотрите связанные API и разделы.

Задача Подход
Получение объекта, представляющего текущее приложение Используйте свойство Application.Current.
Добавление заставки в приложение См. раздел Добавление экрана-заставки в приложение WPF.
Запуск приложения Используйте метод Application.Run.
Остановка приложения Используйте Shutdown метод Application.Current объекта.
Получение аргументов из командной строки Обработайте Application.Startup событие и используйте StartupEventArgs.Args свойство. Пример см. в описании Application.Startup события.
Получение и задание кода завершения приложения Задайте ExitEventArgs.ApplicationExitCode свойство в Application.Exit обработчике событий или вызовите Shutdown метод и передайте целое число.
Обнаружение необработанных исключений и реагирование на них Обработайте DispatcherUnhandledException событие.
Получение и задание ресурсов области определения приложения Используйте свойство Application.Resources.
Использование словаря ресурсов области определения приложения См. раздел Использование словаря ресурсов Application-Scope.
Получение и задание свойств области определения приложения Используйте свойство Application.Properties.
Получение и сохранение состояния приложения См. раздел Сохранение и восстановление Application-Scope свойств в сеансах приложения.
Управление файлами данных без кода, включая файлы ресурсов, файлы содержимого и файлы исходного сайта. См. раздел ресурс приложения WPF, содержимое и файлы данных.
Управление окнами в автономных приложениях См. раздел Общие сведения об окнах WPF.
Отслеживание навигации и управление ею См. раздел Общие сведения о навигации.

Определение приложения

Чтобы использовать функциональные возможности Application класса, необходимо реализовать определение приложения. определение приложения WPF — это класс, производный от Application и настроенный специальным параметром MSBuild.

Реализация определения приложения

Типичное определение приложения WPF реализуется с помощью разметки и кода программной части. Это позволяет использовать разметку для декларативного задания свойств и ресурсов приложения и регистрации событий, а обработку событий и поведение приложения реализовывать в коде программной части.

В следующем примере показано, как реализовать определение приложения с помощью разметки и кода программной части:

<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

Для совместной работы файла разметки и файла кода программной части должны выполняться указанные ниже условия.

  • В разметке элемент Application должен включать атрибут x:Class. при построении приложения существование x:Class в файле разметки приводит к тому, что MSBuild создает partial класс, производный от, Application и имеет имя, заданное x:Class атрибутом. Для этого требуется добавить объявление пространства имен XAML в схему XAML (xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml").

  • В коде программной части класс должен быть partial классом с тем же именем, которое задано x:Class атрибутом в разметке и должен быть производным от Application . Это позволяет связать файл кода программной части с partial классом, созданным для файла разметки при сборке приложения (см. раздел Создание приложения WPF).

Примечание

при создании нового проекта приложения wpf или проекта приложения браузера wpf с помощью Visual Studio определение приложения включается по умолчанию и определяется с помощью разметки и кода программной части.

Этот код является минимумом, необходимым для реализации определения приложения. однако перед сборкой и запуском приложения необходимо внести в определение приложения дополнительную конфигурацию MSBuild.

Настройка определения приложения для MSBuild

Для работы автономных приложений и приложений браузера XAML (XBAP) требуется реализация определенного уровня инфраструктуры. Наиболее важной частью этой инфраструктуры является точка входа. При запуске приложения пользователем операционная система вызывает точку входа, которая является известной функцией для запуска приложений.

Обычно разработчикам требовалось писать весь этот код или его часть самостоятельно в зависимости от технологии. однако WPF создает этот код, если файл разметки определения приложения настроен в качестве MSBuild ApplicationDefinition элемента, как показано в следующем MSBuildном файле проекта:

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

поскольку файл кода программной части содержит код, он помечается как Compile элемент MSBuild, как обычная.

применение этих MSBuild конфигураций к файлам разметки и кода программной части определения приложения приводит к тому, что MSBuild создает код следующим образом:

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 . STAThreadAttributeАтрибут применяется к Main методу, чтобы указать, что основной поток пользовательского интерфейса для приложения WPF является потоком STA, который необходим для приложений WPF. При вызове Main метод создает новый экземпляр класса App перед вызовом InitializeComponent метода для регистрации событий и задания свойств, которые реализуются в разметке. Поскольку InitializeComponent создается автоматически, вам не нужно явно вызывать InitializeComponent из определения приложения, как Page и для Window реализаций. Наконец, Run вызывается метод для запуска приложения.

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

Поскольку функциональные возможности Application класса являются общими для приложения, в каждый из них может быть только один экземпляр Application класса AppDomain . Для этого Application класс реализуется как одноэлементный класс (см. реализацию Singleton в C#), который создает единственный экземпляр и предоставляет общий доступ к нему со static Current свойством.

В следующем коде показано, как получить ссылку на Application объект для текущего объекта AppDomain .

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

Current Возвращает ссылку на экземпляр Application класса. Если требуется ссылка на Application производный класс, необходимо привести значение Current свойства, как показано в следующем примере.

// 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 объекта. Однако следует соблюдать осторожность. После Application создания экземпляра класса существует период, в течение которого состояние Application объекта не согласовано. В течение этого периода времени выполняет Application различные задачи инициализации, необходимые для выполнения кода, включая установку инфраструктуры приложений, настройку свойств и регистрацию событий. Если вы попытаетесь использовать Application объект в течение этого периода, код может иметь непредвиденные результаты, особенно если он зависит от различных Application заданных свойств.

Когда Application завершает работу инициализации, действительно начинается его время существования.

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

Время существования приложения WPF помечается несколькими событиями, которые вызываются, Application чтобы сообщить, когда приложение запущено, было активировано и отключено, а также было завершено.

Заставка

начиная с платформа .NET Framework 3,5 с пакетом обновления 1 (SP1), можно указать изображение, которое будет использоваться в окне запуска или на экране-заставке. SplashScreenКласс позволяет легко отображать окно запуска во время загрузки приложения. SplashScreenОкно создается и отображается перед Run вызовом метода. Дополнительные сведения см. в статьях время запуска приложения и Добавление экрана-ЗАСТАВКИ в приложение WPF.

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

После Run вызова и инициализации приложения приложение готово к выполнению. Этот момент означает, что Startup возникает событие:

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>

На этом этапе существования приложения наиболее распространенной особенностью является отображение пользовательского интерфейса.

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

большинство автономных Windows приложений открывают, Window когда они начинают работать. StartupОбработчик событий — это одно из расположений, из которого можно сделать это, как показано в следующем коде.

<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 в автономном приложении, по умолчанию превращается в основное окно приложения. WindowНа этот объект ссылается Application.MainWindow свойство. Значение MainWindow свойства может быть изменено программным образом, если другое окно, отличное от первого экземпляра, Window должно быть основным окном.

При первом запуске XBAP, скорее всего, будет выполнен переход к Page . Это показано в приведенном ниже коде.

<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 атрибут в разметке.

В следующем примере показано, как использовать StartupUri из автономного приложения для открытия Window .

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

В следующем примере показано, как использовать StartupUri из XBAP для перехода к Page .

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

Эта разметка действует так же, как и предыдущий код для открытия окна.

Примечание

Дополнительные сведения о навигации см. в разделе Общие сведения о навигации.

Необходимо обработать Startup событие, чтобы открыть, если необходимо Window создать его экземпляр с помощью конструктора без параметров, или необходимо задать его свойства или подписываться на его события перед отображением, или необходимо обработать аргументы командной строки, которые были предоставлены при запуске приложения.

Обработка аргументов командной строки

в Windows автономные приложения можно запускать из командной строки или с рабочего стола. В обоих случаях аргументы командной строки могут быть переданы приложению. В приведенном ниже примере показано приложение, которое запускается с одним аргументом командной строки /StartMinimized:

wpfapplication.exe /StartMinimized

Во время инициализации приложения WPF получает аргументы командной строки из операционной системы и передает их Startup обработчику событий через Args свойство StartupEventArgs параметра. Аргументы командной строки можно извлечь и сохранить с помощью приведенного ниже кода.

<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 . Обратите внимание, что поскольку WindowState свойство должно быть задано программно, главное Window необходимо открыть в коде явным образом.

xbap не могут извлекать и обрабатывать аргументы командной строки, так как они запускаются с помощью ClickOnce развертывания (см. раздел развертывание приложения WPF). Однако они могут извлекать и обрабатывать строковые параметры запроса из URL-адресов, которые используются для их запуска.

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

Windows позволяет пользователям переключаться между приложениями. Наиболее простой способ — использовать клавиши ALT+TAB. Приложение может быть переключено на, только если оно видимо Window , которое пользователь может выбрать. Выбранный в данный момент объект Window является активным окном (также известным как окно переднего плана) и — это объект Window , который получает входные данные пользователя. Приложение с активным окном — это активное приложение (или Приложение переднего плана). Приложение становится активным в указанных ниже случаях.

  • Он запускается и отображает Window .

  • Пользователь переключается из другого приложения, выбирая Window в приложении.

Можно определить, когда приложение станет активным, обрабатывая Application.Activated событие.

Аналогичным образом приложение может стать неактивным в указанных ниже случаях.

  • Пользователь переключается на другое приложение из текущего.

  • Приложение завершает работу.

Можно определить, когда приложение станет неактивным, обрабатывая Application.Deactivated событие.

В следующем коде показано, как управлять Activated Deactivated событиями и, чтобы определить, является ли приложение активным.

<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Можно также активировать и деактивировать. Дополнительные сведения см. в разделах Window.Activated и Window.Deactivated.

Примечание

Application.Activated Application.Deactivated Для XBAP не вызывается ни, ни.

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

Время существования приложения заканчивается, когда оно завершает работу, что может возникнуть по указанным ниже причинам.

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

  • Пользователь закрывает основной Window .

  • пользователь завершает сеанс Windows путем выхода из системы или завершения его работы.

  • Выполнено специальное условие для приложения.

Чтобы упростить управление завершением работы приложения, Application предоставляет Shutdown метод, ShutdownMode свойство и SessionEnding Exit события и.

Примечание

Shutdown может вызываться только из приложений, имеющих UIPermission . Это разрешение всегда имеет автономные приложения WPF. Однако XBAP, работающие в изолированной среде безопасности с частичным доверием зоны Интернета, не имеют.

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

Большинство приложений завершают работу при закрытии главного окна или всех окон. Иногда, однако, другие условия конкретного приложения могут определить, когда приложение завершает работу. Можно указать условия, при которых приложение будет закрыто, задав ShutdownMode одно из следующих ShutdownMode значений перечисления:

Значение по умолчанию ShutdownModeOnLastWindowClose , то есть приложение автоматически завершает работу при закрытии пользователем последнего окна в приложении. Однако если при закрытии главного окна приложение должно завершить работу, WPF автоматически делает это, если задано значение ShutdownMode OnMainWindowClose . Это показано в следующем примере.

<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 . В этом случае вы отвечаете за завершение работы приложения путем явного вызова Shutdown метода. в противном случае приложение продолжит работать, даже если все окна закрыты. Обратите внимание, что Shutdown вызывается неявно, если ShutdownMode имеет значение OnLastWindowClose или OnMainWindowClose .

Примечание

ShutdownMode может быть задано из XBAP, но игнорируется; XBAP всегда завершает работу при переходе из в браузере или при закрытии браузера, на котором размещается XBAP. Дополнительные сведения см. в разделе Общие сведения о навигации.

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

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

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

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

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

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

чтобы определить, когда завершается сеанс Windows, можно выполнить обработку SessionEnding события, как показано в следующем примере.

<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. Он использует это значение, чтобы отобразить сообщение подтверждения для пользователя. если пользователь не хочет, чтобы сеанс закончится, код задает для значение, чтобы Cancel true предотвратить завершение сеанса Windows.

Примечание

SessionEnding не вызывается для XBAP.

Выход

При завершении работы приложения может возникнуть необходимость выполнить окончательную обработку, например сохранение состояния приложения. В таких ситуациях можно выполнить обработку Exit события, как это App_Exit делает обработчик событий в следующем примере. Он определяется как обработчик событий в файле app. XAML . Его реализация выделяется в файлах app. XAML. CS и Application. XAML. vb .

<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 свойств в сеансах приложения.

Exit может обрабатываться как автономными приложениями, так и XBAP. Для XBAP Exit вызывается в следующих случаях:

  • Выполняется переход к XBAP из.

  • В Internet Explorer, когда вкладка, на которой размещается XBAP, закрыта.

  • Закрывается браузер.

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

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

Примечание

при отладке из Visual Studio код завершения приложения отображается в окне вывода при завершении работы приложения в сообщении, которое выглядит следующим образом:

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

Чтобы открыть окно вывода , щелкните вывод в меню вид .

Чтобы изменить код выхода, можно вызвать Shutdown(Int32) перегрузку, которая принимает целочисленный аргумент в качестве кода выхода:

// 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 событие. ExitОбработчик событий передается, ExitEventArgs который предоставляет доступ к коду выхода со ApplicationExitCode свойством. Дополнительные сведения см. в разделе Exit.

Примечание

Код выхода можно задать как в автономных приложениях, так и в XBAP. Однако значение кода выхода игнорируется для XBAP.

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

Иногда приложение может завершить работу из-за неправильного состояния, например когда создается непредвиденное исключение. В этом случае в приложении может не быть кода для обнаружения и обработки исключения. Исключение такого типа является необработанным. Перед закрытием приложения выводится уведомление, похожее на показанное на рисунке ниже.

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

С точки зрения работы пользователя такое поведение приложения по умолчанию лучше переопределить, выполнив некоторые или все следующие действия:

  • отображение понятных для пользователя сведений;

  • попытка продолжить выполнение приложения;

  • запись подробных сведений об исключениях, понятных разработчикам, в журнал Windows событий.

Реализация этой поддержки зависит от возможности обнаружения необработанных исключений, DispatcherUnhandledException о которых вызывается событие.

<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 ). Эту информацию можно использовать для определения способа обработки исключений.

При обработке необходимо DispatcherUnhandledException задать DispatcherUnhandledExceptionEventArgs.Handled для свойства значение true ; в противном случае WPF по-прежнему считает исключение необработанным и вернется к поведению по умолчанию, описанному выше. Если возникает необработанное исключение и DispatcherUnhandledException событие не обрабатывается, или событие обрабатывается и Handled имеет значение false , приложение немедленно завершает работу. Кроме того, другие Application события не вызываются. Следовательно, необходимо выполнить обработку, DispatcherUnhandledException Если в приложении есть код, который должен выполняться перед завершением работы приложения.

Хотя приложение может завершить работу в результате возникновения необработанного исключения, приложение обычно завершает работу в ответ на запрос пользователя, как описано в следующем разделе.

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

Автономные приложения и XBAP не имеют точно одинакового времени существования. На приведенном ниже рисунке продемонстрированы ключевые события времени существования автономного приложения и показана последовательность, в которой они создаются.

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

Аналогично, на следующем рисунке показаны ключевые события времени существования XBAP и показана последовательность, в которой они создаются.

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

См. также