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

Этот раздел предоставляет обзор служб Windows Presentation Foundation (WPF) для создания и управления приложениями. Ядро WPF-приложения является классом Application, который поддерживает ряд основных служб приложений. Этот раздел предоставляет введение в наиболее важные из этих служб.

В этом разделе содержатся следующие подразделы.

  • Класс приложения
  • Определение приложения
  • Получение текущего приложения
  • Время жизни приложения
  • Другие службы приложения
  • Связанные разделы

Класс приложения

Приложение состоит из множества элементов, специфичных для приложения, включая user interface (UI), бизнес-логику, логику доступа к данным, элементы управления и данные. Эти элементы обычно отличаются в различных приложениях. Тем не менее, все приложения имеют тенденцию совместно использовать общий набор функциональных возможностей, которые способствуют реализации и управлению приложения. В WPF эти общие функциональные возможности области приложения инкапсулируются классом помощью Application, который предоставляет следующие службы:

  • Создание и управление общей инфраструктурой приложений.

  • Отслеживание и взаимодействие со временем жизни приложения.

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

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

  • Обнаружение и реагирование на необработанные исключения.

  • Возврат кодов завершения.

  • Управление окнами автономных приложений (см.: Общие сведения об окнах WPF).

  • Отслеживание и управление навигацией (см.: Общие сведения о переходах).

Для использования этих служб в приложении, вам необходимо использовать класс Application, чтобы реализовать определение приложения.

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

Определение приложения WPF представляет собой класс, производный от Application и настроенный со специальным параметром Microsoft build engine (MSBuild).

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

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

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

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

Imports Microsoft.VisualBasic
Imports System.Windows ' Application

Namespace SDKSample
    Partial Public Class App
        Inherits Application
    End Class
End Namespace
using System.Windows;  // Application

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

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

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

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

ПримечаниеПримечание

При создании нового проекта приложения WPF или проекта приложения браузера WPF с помощью Microsoft Visual Studio, определение приложения включается по умолчанию и определяется с помощью разметки и фонового кода.

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

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

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

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

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

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

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


Imports Microsoft.VisualBasic
Imports System ' STAThread
Imports System.Windows ' Application

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


...


        End Sub
    End Class
End Namespace
using System; // STAThread
using System.Windows; // Application

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()
        {


...


        }
    }
}

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

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

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

Следующий фрагмент кода иллюстрирует получение ссылки на объект Application для текущего AppDomain.

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

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

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

Можно проверить значение Current в любой момент времени жизни объекта Application. Однако следует соблюдать осторожность. После того, как создается класс Application, есть период, в течение которого состояние объекта Application непредсказуемо. В течение этого периода Application выполняет различные задачи инициализации, необходимые коду для выполнения, включая установку инфраструктуры приложений, настройку свойств и регистрацию событий. Если использовать объект Application в течение этого периода, то выполнение кода может привести к неожиданным результатам, особенно если он зависит от различных установленных свойств Application.

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

Время жизни приложения

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

Этот подраздел состоит из следующих пунктов.

  • Экран-заставка
  • Запуск приложения
  • Отображение интерфейса пользователя
  • Обработка аргументов командной строки
  • Активация и деактивация приложения
  • Завершение работы приложения
  • Необработанные исключения.
  • События времени жизни приложения

Экран-заставка

Начиная с версии .NET Framework 3.5 с пакетом обновления 1 (SP1), можно указать изображение, которое должно использоваться в окне запуска, или на экране-заставке. Класс SplashScreen позволяет легко отобразить окно запуска во время загрузки приложения. Окно SplashScreen создается и отображается перед вызовом Run. Дополнительные сведения см. в разделах Время запуска приложения и Практическое руководство. Добавление в WPF-приложение экрана-заставки.

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

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


Imports Microsoft.VisualBasic
Imports System.Windows ' Application, StartupEventArgs, WindowState

Namespace SDKSample
    Partial Public Class App
        Inherits Application
        Private Sub App_Startup(ByVal sender As Object, ByVal e As StartupEventArgs)
            ' Application is running


...


        End Sub
    End Class
End Namespace
using System.Windows; // Application, StartupEventArgs, WindowState

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


...


        }
    }
}

В этот момент жизни приложения наиболее обычной вещью является показ UI.

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

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

<Application
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="SDKSample.App" 
  Startup="App_Startup" />

Imports Microsoft.VisualBasic
Imports System.Windows ' Application, StartupEventArgs

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
using System.Windows; // Application, StartupEventArgs

namespace SDKSample
{
    public partial class App : Application
    {
        void App_Startup(object sender, StartupEventArgs e)
        {
            // Open a window
            MainWindow window = new MainWindow();
            window.Show();
        }
    }
}
ПримечаниеПримечание

Первое Window, создающееся в автономном приложении становится главным окном приложения по умолчанию.Этот объект Window ссылается на свойство Application.MainWindow.Значение свойства MainWindow может быть изменено программными средствами, если другое окно Window станет главным окном.

При первом запуске XBAP, оно скорее всего перейдет на Page. Это показано в следующем коде.

<Application 
  x:Class="SDKSample.App"
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
  Startup="App_Startup" />

Imports System ' Uri, UriKind, EventArgs, Console
Imports System.Windows ' Application, StartupEventArgs
Imports System.Windows.Navigation ' NavigationWindow

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
using System; // Uri, UriKind, EventArgs, Console
using System.Windows; // Application, StartupEventArgs
using System.Windows.Navigation; // NavigationWindow

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

Если вы обрабатываете Startup только чтобы открыть Window или перейти на Page, вместо этого вы можете установить атрибут StartupUri в разметке.

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

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

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

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

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

ПримечаниеПримечание

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

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

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

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

wpfapplication.exe /StartMinimized

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

<Application
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="SDKSample.App"
  Startup="App_Startup" />

Imports Microsoft.VisualBasic
Imports System.Windows ' Application, StartupEventArgs, WindowState

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
using System.Windows; // Application, StartupEventArgs, WindowState

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();
        }
    }
}

Код обрабатывает Startup, чтобы проверить, передан ли аргумент командной строки /StartMinimized; если это так, он открывает главное окно с WindowState Minimized. Обратите внимание, что поскольку свойство WindowState должно быть установлено программными средствами, главное Window должно быть явным образом открыто в коде.

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

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

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

  • Оно запущено и показывает Window.

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

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

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

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

  • Когда приложение завершает работу.

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

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

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

Imports Microsoft.VisualBasic
Imports System ' EventArgs
Imports System.Windows ' Application

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
using System; // EventArgs
using System.Windows; // Application

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

Window также может быть активировано и дезактивировано. Дополнительные сведения см. в разделах Window.Activated и Window.Deactivated.

ПримечаниеПримечание

Ни Application.Activated, ни Application.Deactivated не вызывается для XBAPs.

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

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

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

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

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

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

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

ПримечаниеПримечание

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

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

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

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

<Application
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://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="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.App"
    StartupUri="MainWindow.xaml"
    SessionEnding="App_SessionEnding" />

Imports Microsoft.VisualBasic
Imports System.Windows ' Application, SessionEndingCancelEventArgs, MessageBox, MessageBoxResult, MessageBoxButton

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
using System.Windows; // Application, SessionEndingCancelEventArgs, MessageBox, MessageBoxResult, MessageBoxButton

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

В этом примере код проверяет свойство ReasonSessionEnding для определения способа завершения сеанса Windows. Он использует это значение, чтобы отобразить сообщение подтверждения пользователю. Если пользователю не нужно завершать сеанс, код устанавливает Cancel в true, чтобы запретить завершение сеанса Windows.

ПримечаниеПримечание

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

Exit

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

<Application
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.App"
    StartupUri="MainWindow.xaml" 
    Startup="App_Startup" 
    Exit="App_Exit">


...


</Application>
Imports System.IO ' StreamReader, FileMode
Imports System.IO.IsolatedStorage ' IsolatedStorageFile, IsolatedStorageFileStream

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



...


        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
using System.Windows; // Application, StartupEventArgs
using System.IO; // StreamReader, FileMode
using System.IO.IsolatedStorage; // IsolatedStorageFile, IsolatedStorageFileStream

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



...


        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]);
                }
            }
        }
    }
}

Полный пример см. в разделе Практическое руководство. Сохранение и восстановление свойств области определения приложения в сеансах приложения.

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

  • XBAP уходит из обозревателя.

  • В Internet Explorer 7, при закрытии вкладки, на которой размещены 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.

ПримечаниеПримечание

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

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

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

Уведомление о необработанном исключении

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

  • Отображение удобных для пользователя данных.

  • Попытка сохранить выполнение приложения.

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

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

<Application
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="SDKSample.App"
  StartupUri="MainWindow.xaml"
  DispatcherUnhandledException="App_DispatcherUnhandledException" />

Imports Microsoft.VisualBasic
Imports System.Windows ' Application
Imports System.Windows.Threading ' DispatcherUnhandledExceptionEventArgs

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
using System.Windows; // Application
using System.Windows.Threading; // DispatcherUnhandledExceptionEventArgs

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

Обработчик событий DispatcherUnhandledException передает параметр DispatcherUnhandledExceptionEventArgs, содержащий контекстные сведения, касающиеся необработанного исключения, включая исключение самого себя (DispatcherUnhandledExceptionEventArgs.Exception). Можно использовать эту информацию для определения способа обработки исключений.

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

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

События времени жизни приложения

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

Автономное приложение – события объекта приложения

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

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

Другие службы приложения

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

  • Общие свойства области приложения.

  • Общие ресурсы области приложения.

  • Файлы данных ресурсов, содержимого и исходный веб-узел приложения.

  • Управление окнами

  • Управление навигацией.

Общие свойства области приложения.

Приложение предоставляет свойство Properties для предоставления состояния, которое может быть совместным по всему приложению. Ниже приведен пример использования Properties:

      ' Set an application-scope property with a custom type
      Dim customType As New CustomType()
      Application.Current.Properties("CustomType") = customType


...


      ' Get an application-scope property
      ' NOTE: Need to convert since Application.Properties is a dictionary of System.Object
      Dim customType As CustomType = CType(Application.Current.Properties("CustomType"), CustomType)
// Set an application-scope property with a custom type
CustomType customType = new CustomType();
Application.Current.Properties["CustomType"] = customType;


...


// Get an application-scope property
// NOTE: Need to convert since Application.Properties is a dictionary of System.Object
CustomType customType = (CustomType)Application.Current.Properties["CustomType"];

Дополнительную информацию можно найти в следующих статьях:

Общие ресурсы области приложения.

Приложение предоставляет свойство Resources, чтобы позволить разработчикам приложений совместно использовать ресурсы UI. Ниже приведен пример использования Resources:

      ' Set an application-scope resource
      Application.Current.Resources("ApplicationScopeResource") = Brushes.White


...


      ' Get an application-scope resource
      Dim whiteBrush As Brush = CType(Application.Current.Resources("ApplicationScopeResource"), Brush)
// Set an application-scope resource
Application.Current.Resources["ApplicationScopeResource"] = Brushes.White;


...


// Get an application-scope resource
Brush whiteBrush = (Brush)Application.Current.Resources["ApplicationScopeResource"];

Дополнительную информацию можно найти в следующих статьях:

Файлы данных ресурсов, содержимого и исходный веб-узел приложения.

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

Управление окнами

Application и Window имеют близкую связь. Как видно, время существования приложения может зависить от времени существования его окон, которое задается свойством ShutdownMode. Application записывает, какое окно отмечено как главное окно приложения (Application.MainWindow) и поддерживает список всех окон, экземпляры которых на данный момент созданы в приложении (Application.Windows).

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

Управление навигацией.

Для автономных приложений с навигацией (используя NavigationWindow и Frame) или XBAPs, Application обнаруживается любой переход внутри приложения и вызываются соответствующие следующие события:

Кроме того, Application предоставляет возможность для приложений любого типа создавать, сохранять и получать cookies, используя GetCookie и SetCookie

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

См. также

Ссылки

Application

Основные понятия

Общие сведения об окнах WPF

Общие сведения о переходах

Ресурсы, Содержимое и Файлы данных WPF-приложения

URI типа "pack" в WPF

Разработка приложений

Другие ресурсы

Модель приложения: практические руководства