Общие сведения об управлении приложением
Этот раздел предоставляет обзор служб 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 и показана последовательность, в которой они вызываются.
Другие службы приложения
В дополнение к управлению временем жизни приложения 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
Дополнительные сведения см. в разделе Общие сведения о переходах.
См. также
Ссылки
Основные понятия
Ресурсы, Содержимое и Файлы данных WPF-приложения