WPF, Створення та зупинення програми

У WPF програма проходить через простий життєвий цикл. Незабаром після запуску програми створюється об'єкт Application. Під час його виконання виникають різні події програми, які можна відстежувати. І, нарешті, коли об'єкт програми звільняється, програма завершується.

WPF дозволяє створювати повноцінні програми, які створюють ілюзію роботи у веб-браузері. Ці програми називаються XBAP. Щодо XBAP-додатків слід зазначити, що в них застосовується той же клас Application, генеруються ті ж події життєвого циклу та використовуються ресурси складання таким самим способом, що і в стандартних додатках на основі WPF.

Створення об'єкта Application

Найпростіший спосіб використання класу Application передбачає створення вручну. У наступному прикладі демонструється абсолютний мінімум: точка входу в програму (метод Main()), яка створює вікно на ім'я Window1 і запускає новий додаток:

Передача вікна методу Application.Run() призводить до того, що це вікно встановлюється як головне і доступне в усьому додатку через властивістьApplication.MainWindow. Метод Run() потім ініціює подію Application.Startup та відображає головне вікно.

Запущений подібним чином додаток продовжує роботу доти, поки головне вікно та всі його інші вікна не будуть закриті. У цей момент метод Run() поверне управління і, перш ніж завершиться програма, буде виконано будь-який додатковий код Main().

Щоб запустити програму з використанням методу Main(), необхідно визначити клас, який містить метод Main() як стартовий об'єкт у Visual Studio. Щоб зробити це, двічі клацніть на вузлі Properties (Властивості) у Solution Explorer і змінітьвибір у списку Startup Object (Стартовий об'єкт). Зазвичай це робити не знадобиться, тому що Visual Studio створює метод Main() автоматично на основі шаблону XAML.

Наслідування спеціального класу додатку

Хоча підхід, описаний у попередньому розділі (зі створенням екземпляра базового класу Application та викликом Run()), працює цілком задовільно, при створенні нової програми WPF цей варіант у Visual Studio не використовується.

Натомість Visual Studio створює спеціальний клас, успадкований від Application. У простому додатку такий підхід не дає суттєвого ефекту. Однак, якщо планується обробка подій програми, він надає більш витончену модель, тому що код обробки подій може бути поміщений у клас, похідний від Application.

Модель, реалізована Visual Studio щодо класу Application, власне, та ж, як і модель, застосовувана для вікон. Початкова точка — шаблон XAML, за промовчанням званий App.xaml. Нижче показано, як він виглядає:

Атрибут Class використовується XAML для створення класу, успадкованого від елемента. Таким чином, створюється клас, успадкований від Application, на ім'я WpfApplication1.App. (WpfApplication1 — назва проекту, що збігається з простором імен, в якому визначено клас, а App — ім'я Visual Studio для спеціального класу, успадкованого від Application. За бажанням це ім'я класу можна замінити більш виразним.)

Дескриптор Application не тільки створює спеціальний клас програми, але також встановлює властивість StartupUri для ідентифікації документа XAML, що представляє головне вікно. В результаті не знадобиться явно створювати екземпляр цього вікна в коді - аналізатор XAML зробить це сам.

Як із вікном, клас програми визначено у двох окремих частинах, які об'єднуються разом під час компіляції. Автоматично згенерована частина в проекті невидима, але вона містить точку входу Main() та код для запуску програми. Виглядає це приблизно так, як показано нижче:

Якщо ви дійсно зацікавлені побачити спеціальний клас програми, створений шаблоном XAML, загляньте у файл App.g.cs у папці obj --> Debug всередині каталогу проекту.

Єдина відмінність між автоматично згенерованим кодом, показаним тут, і спеціальним класом програми, який ви можете створити самостійно, полягає в тому, що автоматично згенерований клас використовує властивість StartupUri замість встановлення властивості MainWindow або передачі головного вікна як параметр методу Run(). Використовуючи той самий формат URI, можна створити спеціальний клас програми, який використовує цей підхід.

Потрібно створити об'єкт відносного URI, який називає документ XAML, що знаходиться в проекті. (Цей документ XAML компілюється та вбудовується у складання програми у вигляді ресурсу BAML. Ім'ям ресурсу є ім'я вихідного файлу XAML.)

Зупинення програми

Зазвичай клас Application залишає програму активною доти, доки відкрито хоча б одне вікно. Якщо така поведінка не потрібна, можна змінити значення властивостіApplication.ShutdownMode. При створенні об'єкта Application вручну, властивість ShutdownMode має бути встановлена ​​перед запуском Run(). Якщо використовується файл App.xaml, можна просто встановити властивість ShutdownMode у коді розмітки XAML.

Режим зупинки програми може приймати три значення:

OnLastWindowClose

Стандартна поведінка — програма виконується до тих пір, поки не існуєхоч би одне відкрите вікно. Після закриття головного вікна властивість Application.MainWindow, як і раніше, посилається на об'єкт, що представляє закрите вікно. (Додатково можна використовувати код для перепризначення властивості MainWindow, щоб воно вказувало на інше вікно.)

OnMainWindowClose

Це традиційний підхід - додаток залишається активним тільки поки відкрите головне вікно