Windows Presentation Foundation (WPF, кодова назва — Avalon) — графічна (презентаційна) підсистема (аналог WinForms), яка починаючи з .NET Framework 3.0 в складі цієї платформи. Має пряме відношення до XAML. WPF разом з .NET Framework 3.0 вбудована в Windows Vista, а також доступна для установки в Windows XP Service Pack 2 і Windows Server 2003.

Це перше реальне оновлення технологічного середовища призначеного для користувача інтерфейсу з часу випуску Windows 95. Воно включає нове ядро для заміни GDI і GDI+, використовувані в Windows Forms. WPF є високорівневим об'єктно-орієнтованим функціональним шаром (), що дозволяє створювати двовимірні та тривимірні інтерфейси.

XAML XAML (скорочення від Extensible Application Markup Language — розширювана мова розмітки застосунків) є мовою розмітки, яку використовують для створення екземплярів об'єктів .NET. Хоча мова XAML — це технологія, що може бути застосовна до багатьох різних предметних областей, її головне призначення — конструювання інтерфейсів користувачів WPF. Інакше кажучи, документи XAML визначають розташування панелей, кнопок та інших елементів керування, що становлять вікна в застосунку WPF. Малоймовірно, що вам доведеться писати код XAML вручну. Замість цього ви використовуєте інструмент, що генерує необхідний код XAML. Існує кілька підмножин XAML: WPF XAML включає елементи, що описують вміст WPF з розряду векторної графіки, елементів керування й документів. У цей час це найважливіше застосування XAML. XPS XAML — частина WPF XAML, що визначає XML-подання відформатованих електронних документів. Вона опублікована як окремий стандарт XML Paper Specification (XPS). Silverlight XAML — підмножина WPF XAML, призначена для Silverlight-застосунків. Можна відвідати сайт https://web.archive.org/web/20121030190821/http://www.silverlight.net/, щоб ознайомитися з деталями. WF XAML включає елементи, що описують уміст Windows Workflow Foundation (WF). Додаткова інформація про WF доступна на сайті https://web.archive.org/web/20081111114953/http://wf.netfx3.com/

Клас Application У процесі виконання кожний застосунок WPF представлено екземпляром класу System.Windows.Application. Цей клас відслідковує всі відкриті вікна у вашому застосунку, вирішує, коли ваш застосунок повинен бути зупиненим, і ініціює події застосунка, які ви можете обробляти для виконання ініціалізації або очищення. У WPF застосунок проходить через простий життєвий цикл. Одразу після запуску вашого застосунка створюється об'єкт застосунка. У процесі його виконання виникають різні події застосунка, які ви можете відслідковувати. І, нарешті, коли об'єкт застосунка звільняється, ваш застосунок завершується. Найпростіший спосіб використання класу Application полягає в його створенні вручну. Наступний приклад демонструє абсолютний мінімум: точку входу в застосунок — метод Main (), що створює вікно з іменем Window1 і запускає новий застосунок.using System; using System.Windows; public class Startup { [STAThread] static void Main()

// Створення застосунку. Application app = new Application(); // Створення головного вікна. Window1 win = new Window1 () ; // Запуск застосунку і відображення головного вікна. арр.Run(win) ;

}Звичайно клас Application залишає ваш застосунок активним до тих пір, доки хоча б одне вікно залишається відкритим. Якщо вам не потрібно таке поводження, ви можете змінити Application.ShutdownMode. Якщо ви створюєте об'єкт Application вручну, вам необхідно установити властивість ShutdownMode перед запуском Run(). Можливі такі варіанти:

OnLastWindowClose — поводження за замовчуванням — ваш застосунок виконується доти, доки існує хоча б одне відкрите ним вікно. Якщо ви закриваєте головне вікно, то властивість Application.MainWindow усе ще посилається на об'єкт, що представляє закрите вікно. OnMainWindowClose — це традиційний підхід — застосунок залишається живим тільки доти, поки відкрито головне вікно. OnExplicitShutdown Застосунок ніколи не завершується (навіть якщо всі вікна закриті), поки ви навмисно не викличете Application.Shutdown(). Цей підхід може бути виправданий, якщо ваш застосунок є інтерфейсом для задачі, що виконується досить довго, або якщо ви хочете використовувати складішу логіку, щоб вирішити, коли ваш застосунок повинен закритися (і тоді ви викликаєте метод Application.Shutdown()). Незалежно від того, який спосіб зупину ви використовуєте, ви завжди можете викликати метод Application.Shutdown () для негайного завершення роботи застосунку. Події класу Application Початково файл App.xaml.cs не містить ніякого коду. Хоч код не обов'язковий, ви можете додати код обробки подій застосунка. Клас Application надає невеликий набір корисних подій. Нижче перераховані найважливіші з них. Startup — відбувається після виклику методу Application.Run () і безпосередньо перед показом головного вікна (якщо ви передаєте головне вікно методу Run()). Exit — відбувається, коли застосунок зупиняється з будь-якої причини, безпосередньо перед поверненням з методу Run(). Ви не можете в цей момент скасувати зупин, хоча код вашого методу Main() може повторно запустити застосунок. Ви можете використовувати подію Exit для установки цілочисельного коду виходу, що повертається методом Run(). SessionEnding — відбувається після завершення сеансу Windows, наприклад, коли користувач виходить із системи або зупиняє комп'ютер. (Можна визначити, що саме відбулося, перевіривши властивість SessionEndingCancelEventArgs. ReasonSessionEnding). Також можна скасувати зупин, надавши SessionEndingCancelEventArgs.Cancel значення true. Якщо цього не робити, то WPF викличе метод Application.Shutdown() після завершення оброблювача події. Activated — відбувається, коли активізується одне з вікон застосунку. Це трапляється, коли ви перемикаєтеся з іншої програми Windows на цей застосунок. Також виникає при першому показі вікна. Deactivated — відбувається при деактивізації вікна застосунка. Відбувається, коли ви перемикаєтеся на іншу програму Windows. DispatcherUnhandledExcept — відбувається, коли виникає неопрацьований виняток у будь-якому місці вашого застосунка (у головному потоці застосунка). Реагуючи на цю подію, ви можете протоколювати критичні помилки — можна нейтралізувати виняток і продовжити роботу застосунка, установивши властивість DispatcherUnhandledExceptionEventArgs.Handled в true. Ви повинні почати цей крок тільки в тому випадку, якщо впевнені, що ваш застосунок перебуває в коректному стані і його робота може бути продовжена.

Відмінність класів Window і WinForm та їхня взаємодія один з одним Вікна (window) є основними елементами в будь-якому настільному застосунку — настільки «основними», що в їхню честь навіть була названа операційна система Windows. І хоча в WPF є модель для створення навігаційних застосунків, що розподіляють задачі по окремих сторінках, вікна залишаються переважною технологією для створення застосунків.

Тим, кому доводилось раніше програмувати із застосуванням набору інструментальних засобів Windows Forms, більша частина пропонованого матеріалу здасться знайомою, тому що клас Window, фактично, є вільнішою моделлю класу Form .

Клас Window успадкований від класу ContentControl. Це означає, що він може містити тільки одного нащадка (яким звичайно є контейнер макета на зразок елемента керування Grid) і що його тло можна зафарбовувати за допомогою кисті шляхом установки властивості Background. Можна ще також використовувати й властивості BorderBrush і BorderThickness для додавання навколо вікна границі, але ця границя додається усередині віконної рамки (тобто по краю клієнтської області). Віконну рамку можна взагалі видаляти і встановлювати на власний розсуд.

Щоб відобразити вікно, необхідно створити екземпляр класу Window і викликати метод Show() або ShowDialog(). Метод ShowDialog() відображає модальне вікно. Модальні вікна не дозволяють користувачеві одержувати доступ до батьківського вікна, блокуючи можливість використання в ньому миші й можливість уведення в ньому яких-небудь даних до тих пір. доки модальне вікно не буде закрито. Також метод ShowDialog() ще й не здійснює повернення до тих пір. доки модальне вікно не буде закрито, так що виконання будь-якого коду, що знаходить після нього, на час відкладається. (Це, однак, не означає, що в цей час не може виконуватися й ніякий інший код — наприклад, при наявності запущеного таймера оброблювач його подій однаково буде працювати). Найбільше часто застосовувана в коді схема виглядає так: відображення модального вікна, очікування його закриття й наступне виконання над його даними якої-небудь операції.

Метод Show() відображає немодальне вікно, що не блокує доступ користувача ні до яких інших вікон. Більше того, метод Show() здійснює повернення відразу ж після відображення вікна, так що наступні після нього в коді оператори виконуються негайно. Можна створювати й показувати відразу кілька немодальних вікон, і користувач може взаємодіяти з усіма ними одночасно. У випадку застосування немодальних вікон іноді потрібен код синхронізації, що гарантує відновлення інформації в другому вікні при внесенні якихось зміні в першому й тим самим виключати імовірність роботи користувача з недійсними даними.

Володіння вікнами .NET дозволяє вікну «володіти» іншими вікнами. Вікна, що мають вікно-власника, зручно застосовувати для плаваючих вікон панелей інструментів і вікон команд. Одним із прикладів такого вікна є вікно Find and Replace (Знайти й замінити) в Microsoft Word. Коли вікно-власник згортається, вікно, яким воно володіє, теж автоматично згортається. Коли вікно, що має власника, перекриває вікно, яке ним володіє, воно завжди відображається зверху.

Для підтримки володіння вікна клас Window пропонує дві властивості: властивість Owner і властивість OwnedWindows. Властивість Owner являє собою посилання, що вказує на вікно, що володіє поточним вікном (якщо таке є), а властивість OwnedWindows — колекцію всіх вікон, якими володіє поточне вікно (знову ж, якщо такі є).

Непрямокутні вікна Вікна незвичайної форми часто є товарним знаком ультрасучасних популярних застосунків багатьох редакторів фотографій, програм для створення кінофільмів і мп3-програвачів. У створенні базового застосунку нестандартної форми в WPF немає нічого складного. Однак створення привабливого вікна незвичайної форми вимагає чималих зусиль — і, нерідко, залучення талановитого дизайнера графіки для створення начерків і фонової графіки. Базова процедура для створення вікна нестандартної форми має на увазі виконання наступних кроків: Встановіть для властивості Window.AllowsTransparency значення true. Встановіть для властивості Window.WindowStyle значення None, щоб сховати не клієнтську область вікна (рядок заголовку). Якщо цього не зробити, при спробі показати вікно з'явиться помилка InvalidOperationException. Встановіть для тла (властивість Background) прозорий колір (колір Transparent, значення альфа-каналу якого дорівнює нулю). Або ж зробіть так, щоб для тла використовувалося зображення, що має прозорі області (з нульовим значенням альфа-канал). Ці три кроки ефективно видаляють стандартний зовнішній вигляд вікна (який фахівці з WPF часто називають хромом (chrome) вікна). Для забезпечення ефекту вікна незвичайної форми далі необхідно надати якийсь непрозорий уміст, що має потрібну форму. Тут можливі перераховані нижче варіанти. Надати фонову графіку, використовуючи файл такого формату, що підтримує прозорість. Наприклад, для тла можна використовувати файл PNG. Це простий прямолінійний підхід, і він дуже зручний, якщо доводиться працювати з дизайнерами, які не розбираються в XAML. Однак через те, що вікно буде візуалізуватися з більшою кількістю пікселів і більш високими системними параметрами DPI, фонова графіка може отримати перекручений вигляд. Це також може представляти проблему й у випадку дозволу користувачеві змінювати розміри вікна.