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 і , використовувані в Windows Forms. WPF є високорівневим об'єктно-орієнтованим функціональним шаром (англ. framework), що дозволяє створювати двовимірні та тривимірні інтерфейси.
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-застосунків. Можна відвідати сайт , щоб ознайомитися з деталями.
- WF XAML включає елементи, що описують уміст Windows Workflow Foundation (WF). Додаткова інформація про WF доступна на сайті
Клас 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 [ 4 березня 2010 у Wayback Machine.].
Клас 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, фонова графіка може отримати перекручений вигляд. Це також може представляти проблему й у випадку дозволу користувачеві змінювати розміри вікна.
- Використовувати доступні в WPF функції для малювання форми, щоб створити тло з векторним умістом. Такий підхід виключає втрату якості, якими б не були розміри вікна й DPI-параметри системи. Однак у цьому випадку напевно буде потрібно використовувати засіб проектування, що підтримує XAML.
- Використовувати більше простий WPF-елемент, що має необхідну форму. Наприклад, вікно із чудовими округленими краями можна створити за допомогою елемента Border. Такий підхід дозволяє створювати вікна із сучасним зовнішнім виглядом у стилі Office без застосування яких-небудь дизайнерських навичок.
Взаємодія з WinForms
В ідеальному світі, як тільки розроблювач освоїв би нову технологію, подібну WPF, він міг би залишити колишню в минулому. Все повинне було б розроблятися тільки на основі нового, найбагатшого інструментарію, не потрібно було б турбуватися про успадкований код. Звичайно цей ідеальний світ не має нічого спільного зі світом реальним, у цьому є дві причини, які змушують розроблювачів WPF у певний момент взаємодіяти із платформою Windows Forms — щоб зберегти інвестиції в розробку існуючого коду й щоб компенсувати можливості, яких бракує в WPF.
Найпростіший спосіб інтеграції вмісту WPF і Windows Forms полягає в розташуванні їх в окремих вікнах. Таким чином, ваш застосунок буде складатися з добре інкапсульованих класів вікон, кожний з яких має справу тільки з однією технологією. Будь-які подробиці взаємодії обробляються в коді «клею» логіці, що створює й відображає вікна.
Додавання форм до застосунка WPF
Найпростіший підхід до змішування вікон і форм полягає в додаванні однієї або більше форм (з набору інструментів Windows Forms) до звичайного застосунку WPF. У Visual Studio це відбувається стандартно — клацання правою кнопкою миші на імені проекту в Solution Explorer і вибір у контекстному меню команду Add New Item. При першому додаванні форми Visual Studio додасть посилання на всі необхідні збірки Windows Forms, включаючи System.Windows.Forms.dll і System.Drawing.dll. Ви можете спроектувати форму в проекті WPF точно так само, як робите це в проекті Windows Forms. Коли ви відкриваєте форму, Visual Studio завантажує звичайний візуальний конструктор форм Windows Forms і наповнює панель інструментів елементами керування Windows Forms. Коли ви відкриваєте файл XAML для вікна WPF, то одержуєте середовище конструктора WPF.
Додавання вікон WPF у застосунок Windows Forms
Зворотний хід трохи складніше. Visual Studio не дозволяє прямо створити нове вікно WPF у застосунку Windows Forms, інакше кажучи, ви не побачите його як один з доступних шаблонів при клацанні правою кнопкою миші на імені проекту і виборі в контекстному меню команди Add New Item. Однак ви можете додати існуючі файли *.cs і *.xaml, які визначають вікно WPF, з іншого проекту. Щоб зробити це клацніть правою кнопкою миші на ім'я проекту в Solution Explorer, виберіть у контекстному меню команду Add Existing Item і знайдіть ці файли. Вам також знадобиться додати посилання на основні збірки WPF (PresentationCore.dll, PresentationFramework.dll і WindowsBase.dll).
Якщо додати вікно WPF до застосунка Windows Forms все буде правильно. Коли ви відкриєте його, то зможете використовувати дизайнер WPF для його модифікації. При побудові проекту буде скомпільований XAML і автоматично згенерований код буде об'єднаний з вашим класом коду, як ніби це було повноцінним WPF — застосунком. Створення проекту, що використовує форми й вікна, є нескладним. Однак є кілька додаткових нюансів, які варто враховувати, коли ви відображаєте ці форми й вікна під час виконання. Якщо вам потрібно показати вікно або форму модально (як це робиться з діалоговими вікнами), то така задача досить проста й не вимагає зміни коду. Але якщо ви хочете показувати вікна в немодальному режимі, то вам знадобиться розробити додатковий код, щоб забезпечити коректну підтримку клавіатури, що буде описано далі.
Відображення модальних вікон і форм
Відображення модальної форми в застосунку WPF не вимагає зусиль. Ви використовуєте в точності той же код. що й у проекті Windows Forms. Наприклад, якщо у вас є клас форми з іменем Form1, те для його модального відображення ви застосовуєте такий код:
Forml frm = new Form1(); if (frm.ShowDialog==System.Windows.Forms.DialogResult.OK) { MessageBox.Show("Ви натиснули на OK у формі Windows Forms."); }
Зауважте, що метод Form.ShowDialog() працює дещо інакше, ніж WPF-метод Window.ShowDialog (). У той час як Window.ShowDialog() повертає true, false або null, метод Form.ShowDialog() повертає значення з перерахування DialogResult. Зворотна задача — відображення вікна WPF з форми — настільки ж проста. Ви просто взаємодієте із загальнодоступним інтерфейсом вашого класу вікна, a WPF подбає про інше:
Windowl win = new Windowl(); if (win.ShowDialog()== true) { MessageBox.Show("Ви натиснули на OK у вікні WPF."); }
Відображення немодальних вікон і форм
Якщо ви хочете відображати вікна або форми в немодальному режимі, то тут все не так просто. Складність полягає в тому. що клавіатурне уведення приймається кореневим застосунком і повинен бути доставлене у відповідне вікно. Щоб це працювало між умістом WPF і Windows Forms, потрібен якийсь спосіб передачі цих повідомлень потрібному вікну або формі.
Якщо ви хочете показувати вікно WPF у немодальному режимі зсередини застосунка Windows Forms, то повинні для цього використовувати статичний метод ElementHost.EnableModelessKeyboardlnterop(). Вам також знадобиться посилання на збірку WmdowsFormsIntegration.dll, що визначає клас ElementHost у просторі імен System.Windows.Formslntegration.
Метод EnableModelessKeyboardlnterop() викликається після створення вікна, але перед його відображенням. Викликаючи цей метод, передайте йому посилання на нове вікно WPF, як показано нижче:
Window1 win = new Window1(); ElementHost.EnableModelessKeyboardInterop(win); win.Show();
При виклику EnableModelessKeyboardlnterop() об'єкт ElementHost додає фільтр повідомлень у застосунок Windows Forms. Цей фільтр повідомлень перехоплює клавіатурні повідомлення, коли активне ваше вікно WPF і пересилає їх йому. Без цього ваші елементи керування WPF просто не одержать клавіатурного уведення.
Якщо потрібно відобразити немодальний застосунок Windows Forms усередині застосунка WPF використовуйте аналогічний метод WindowsFormsHost.EnableWindowsFormsInterop().
Однак у цьому випадку не потрібно передавати посилання на форму, що ви хочете показати. Замість цього ви просто викликаєте цей метод один раз — перед відображенням будь-якої форми (гарним рішенням буде викликати його при запуску застосунка). Тепер ви можете просто показати форму в немодальному режимі, без усяких додаткових зусиль:
WindowsFormsHost.EnableWindowsFormsInterop(); Forml frm = new Forml(); frm.Show();
Без виклику EnableWindowsFormsInterop() ваша форма буде відображатися, але не розпізнає ніякого клавіатурного уведення. Наприклад, ви не зможете використовувати клавішу <Tab> для переходу від одного елемента керування до іншого.
Цей процес можна розширити на кілька рівнів. Наприклад, ви можете створити вікно WPF, що відображатиме форму (модально або не модально), а ця форма, у свою чергу, може показати вікно WPF. Хоча це не доведеться робити дуже часто, все-таки це кращий підхід, аніж підтримка взаємодії між різнорідними елементами. Така підтримка дозволяє інтегрувати різні типи вмісту в одному вікні, але не дозволяє вкладати на більш ніж один рівень углиб (наприклад, створити вікно WPF, що містить елемент керування Windows Forms, що, у свою чергу, містить у собі елемент керування WPF).
Компонування та елементи управління WPF
Поняття компонування в WPF
Вікно WPF може містити тільки один елемент. Щоб розмістити більше одного елемента й створити більше практичний користувальницький інтерфейс, вам потрібно помістити у вікно спеціальний елемент керування — контейнер і потім додавати елементи в цей контейнер.
В WPF компонування визначається використовуваним контейнером. Хоча є кілька контейнерів, серед яких можна вибирати будь-який «ідеальне» вікно WPF має піддаватись описаним нижче ключовим принципам.
- Елементи (такі як елементи керування) не повинні мати явно встановлених розмірів. Замість цього вони ростуть, щоб заповнити їхній уміст. Наприклад, кнопка збільшується, коли ви додаєте в неї текст. Ви можете обмежити елементи керування прийнятними розмірами, установлюючи максимальне й мінімальне їхні значення.
- Елементи не вказують свою позицію в екранних координатах. Замість цього вони впорядковуються своїм контейнером на основі розміру, порядку й (необов'язково) іншої інформації, специфічної для контейнера компонування. Якщо ви хочете додати пробіл між елементами, то використовуєте для цього властивість Margin.
- Контейнери компонування «розділяють» доступний простір між своїми дочірніми елементами. Вони намагаються надати кожному елементу його найкращий розмір (на основі його вмісту), якщо дозволяє вільний простір. Вони можуть також виділяти додатковий простір дочірнім елементам.
- Контейнери компонування можуть бути вкладеними. Типовий користувальницький інтерфейс починається з Grid — найрозвиненішого контейнера, і містить інші контейнери компонування, які організовують менші групи елементів, такі як текстові поля з мітками, елементи списку, піктограми в панелі інструментів і т. д.
Компонування WPF відбувається за дві стадії: стадія виміру й стадія розміщення. На стадії виміру контейнер виконує прохід у циклі дочірніми елементами й опитує їхні найкращі розміри. На стадії розміщення контейнер поміщає дочірні елементи у відповідні позиції.
Всі контейнери компонування WPF є панелями, які успадковані від абстрактного класу System.Windows.Controls.Panel Фактично, базовий клас Panel — це не що інше, як початкова точка для побудови інших більш спеціалізованих класів. WPF пропонує ряд похідних від Panel класів, які ви можете використовувати для організації компонування. Як і всі елементи керування WPF і більшість візуальних елементів, ці класи перебувають у просторі імен System.Windows.Controls.
Основні панелі компонування
- StackPanel — Розміщає елементи в горизонтальний або вертикальний стек. Цей контейнер компонування звичайно використовується в невеликих секціях великого більше складного вікна.
- WrapPanel — Розміщає елементи в серіях рядків з переносом. У горизонтальній орієнтації Wrap Panel розташовує елемент у рядку ліворуч праворуч, потім переходить до наступного рядка. У вертикальній орієнтації WrapPanel розташовує елемент зверху долілиць, використовуючи додаткові стовпчики для доповнення елементів, що залишилися.
- DockPanel — Вирівнює елементи по краю контейнера.
- Grid — Вишиковує елементи в рядки й стовпчики невидимої таблиці. Це один з найбільш гнучких і широко використовуваних контейнерів компонування.
- UniformGrid — Розташовує елементи в невидиму таблицю, установлюючи однаковий розмір для всіх осередків. Цей контейнер компонування використовується нечасто.
- Canvas — Дозволяє елементам позиціонуватися абсолютно — за фіксованими координатами. Цей контейнер компонування найбільше схожий на традиційний компоновщик Windows Forms, але не передбачає засобів прив'язки й стикування. У результаті це невідповідний вибір для вікон змінного розміру, який призводить до значного обсягу роботи.
Властивості компонування
- HorizontalAlignment. Визначає позиціонування дочірнього елемента усередині контейнера компонування, коли доступно додатковий простір по горизонталі. Ви можете вибрати Center, Left, Right або Stretch.
- VerticalAlignment. Визначає позиціонування дочірнього елемента усередині контейнера компонування, коли доступно додатковий простір по вертикалі. Ви можете вибрати Center, Top, Bottom або Stretch.
- Margin. Додає небагато місця навколо елемента. Властивість Margin — це екземпляр структури System.Windows.Thickness з окремими компонентами для верхньої, нижньої, лівої й правої граней.
- MinWidth і MinHeight. Установлює мінімальні розміри елемента. Якщо елемент занадто великий, щоб поміститися в його контейнер компонування, він буде усічений.
- MaxWidth і MaxHeight. Установлює максимальні розміри елемента. Якщо контейнер має вільний простір, елемент не буде збільшений понад зазначені межі, навіть якщо властивості HorizontalAlignment і VerticalAlignment установлені в Stretch.
- Width і Height. Явно встановлюють розміри елемента. Ця установка перевизначає значення Stretch для властивостей HorizontalAlignment і VerticalAlignment. Однак цей розмір не буде встановлений, якщо виходить за межі, задані в MinWidth, MinHeight, MaxWidth і MaxHeight.
Інші елементи управління
- ScrollViewer. В WPF підтримку прокручування забезпечити нескладно, однак для цього буде потрібно спеціальний інгредієнт — елемент керування вмістом ScrollViewer. Щоб забезпечити підтримку прокручування, вам потрібно впакувати вміст, що ви хочете прокручивати, в ScrollViewer. Попри те що цей елемент керування може зберігати що завгодно, звичайно він використовується для впакування контейнера компонування.
- GroupBox і Tabltem — елементи керування вмістом, що мають заголовки. У класу ContentControl є три спадкоємці: GroupBox. Tabltem і Expander. Елемент керування GroupBox є найпростішим з них. Він відображається у вигляді вікна з округленими кутами й заголовком.
- Tabltem представляє сторінку в елементі керування TabControl. Клас Tabltem додає одна важлива властивість IsSelected, що показує, чи відображається в цей момент вкладка в елементі керування TabControl.
Найекзотичнішим елементом керування вмістом є Expander. Він упаковує область умісту, яку користувач може показувати або приховувати, клацаючи на невеликій кнопці зі стрілкою. Ця технологія використовується часто в оперативних довідкових системах, а також на Web-Сторінках, щоб вони могли включати більші обсяги вмісту, не перевантажуючи користувачів інформацією, яку їм не хочеться бачити.
- Найпростішим елементом керування вмістом є Label — мітка. Як і будь-який інший елемент керування вмістом, вона приймає одиночну порцію вмісту, що ви хочете помістити усередині її. Відмітною рисою елемента Label є його підтримка мнемонічних команд — клавіш швидкого доступу, які передають фокус зв'язаному елементу керування.
WPF розпізнає три типи кнопок: Button, CheckBox і RadioButton. Всі ці кнопки являють собою елементи керування вмістом, що є спадкоємцями класу ButtonBase.
WPF включає три текстових елементи керування: TextBox, RichTextBox і PasswordBox. Елемент PasswordBox є прямим спадкоємцем класу Control. Елементи керування TextBox і RichTextBox є спадкоємцями класу TextBase.
WPF включає багато елементів керування, які можуть працювати з колекцією елементів, починаючи із простих елементів керування ListBox і ComboBox і закінчуючи більше спеціалізованими елементами керування, такими як ListView, TreeView і ToolBar. Всі ці елементи керування є нащадками класу ItemsControl (він, у свою чергу, є нащадком класу Control).
Елемент керування Slider є більше спеціалізованим елементом керування, що часом виявляється корисним. Наприклад, ним можна скористатися для завдання числових значень у тих ситуаціях, коли саме число не є особливо важливим. Наприклад, гучність у програвачі найкраще встановлювати, переміщаючи в різні сторони бігунок на лінійці прокручування. Загальна позиція бігунка показує відносну гучність (нормально, тихо, голосно), а лежаче в його основі число не представляє особливого змісту для користувача.
Елемент керування ProgressBar показує хід виконання тривалої задачі. На відміну від повзунка. ProgressBar не є інтерактивним елементом керування. Навпаки, за зміну значення властивості Value відповідає винятково ваш код. (правила WPF визначають, що ProgressBar не повинен бути елементом керування, оскільки він не реагує на дії миші або уведення на клавіатурі.)
Декоратори
Мова йде про декоратори, які звичайно служать для того, щоб графічно урізноманітити й прикрасити область навколо об'єкта. Всі декоратори є спадкоємцями класу System.WindowsControls.Decorator. Більшість декораторів призначена для використання разом з певними елементами керування. Клас Border дуже простий. Він приймає окрему порцію вкладеного вмісту (яким часто є панель компонування) і додає до нього тло або рамку. Viewbox — більш екзотичний декоратор. Принцип, закладений в основу Viewbox, зрозуміти нескладно. Будь-який уміст, що ви поміщаєте в декоратор Viewbox, масштабується таким чином, щоб він міг уміститися в цьому декораторі.
Користувацькі елементи
Користувальницький елемент- не найкращий вибір, коли ви хочете просто підправити зовнішній вигляд елемента, але цілком виправданий, коли потрібно істотно змінити його функціональність. Наприклад, є причини існування в WPF окремих класів TextBox і PasswordBox. тому що вони обробляють натискання клавіш по- різному, зберігаючи дані усередині себе різними способами, по-різному взаємодіючи з іншими компонентами, такими як буфер обміну й т.п. Аналогічно, якщо ви хочете спроектувати елемент керування, що має свій власний винятковий набір властивостей, методів і подій, то вам доведеться створювати його самостійно. FrameworkElement — найнижчий рівень, з яким ви звичайно будете мати справу при створенні користувальницького елемента. Звичайно такий підхід вибирається тільки тоді, коли потрібно намалювати його вміст «з нуля» за допомогою перевизначення OnRender() і використання System.Windows.Media.DrawingContext. Це схоже на підхід, де користувальницький інтерфейс конструювався на основі об'єктів Visual. Клас FrameworkElement надає лиш базовий набір властивостей і подій для елементів, які не призначені для взаємодії з користувачем.
Control Цей клас найчастіше служить початковою точкою при побудові елемента керування «з нуля». Це — базовий клас для всіх взаємодіючих з користувачем графічних елементів керування. Клас Control додає властивості для установки тла й переднього плану, а також шрифту й вирівнювання вмісту. Крім того, цей клас поміщає себе в послідовність табуляції (властивістю isTabStop) і одержує повідомлення про подвійне клацання (через події MouseDoubleCiick і Preview MouseDoubleClick). Але більше важливо те, що клас Control визначає властивість Template, що дозволяє заміняти його зовнішній вигляд з необмеженою гнучкістю. ContentControl. Це — базовий клас для елементів керування, які можуть відображатися як єдине ціле з довільним умістом. Уміст може бути елементом користувальницького об'єкта, застосовуваного в сполученні із шаблоном. Багато елементів керування впаковують специфічний, обмежений тип умісту. Оскільки ці елементи керування не підтримують всіх елементів, вони не повинні визначатися як елементи керування із умістом.
UserControl Це елемент керування із умістом, що може бути сконфігурованим із застосуванням поверхні часу проектування. Хоча такий користувальницький елемент керування не настільки відрізняється від звичайного елемента керування із умістом, звичайно він використовується тоді, коли ви хочете швидко повторно застосувати незмінний блок користувацього інтерфейсу в більш ніж одному вікні (замість створення дійсно окремого елемента керування, що може бути перенесений з одного застосунка в інший). ItemsControl, Selector — базовий клас для елементів керування, службовців оболонками для списків елементів, але не підтримуючий вибір позицій, у той час як Selector — більше спеціалізований базовий клас для елементів, що підтримують вибір. Ці класи нечасто застосовуються для створення користувальницьких елементів керування, оскільки засобу шаблонів даних ListBox, ListView і TreeView забезпечують достатню гнучкість.
Panel. Базовий клас для елементів керування, що володіє логікою компонування. Елемент із компонуванням може містити в собі безліч дочірніх елементів і розміщати їх відповідно до певної семантики компонування. Часто панелі включають прикріплені властивості, які можуть бути встановлені в дочірні елементи для того, щоб конфігурувати їхнє розташування. Decorator. Специфічний клас елемента керування Це базовий клас для елементів, що служать оболонками для інших елементів і забезпечують графічний ефект або певний засіб. Двома яскравими прикладами можуть служити Border, що малює лінію навколо елемента, і viewbox, що масштабує свій уміст динамічно з використанням трансформацій. Серед інших декорацій — клас Chrome, використовуваний для постачання знайомими рамками й тлом часто використовуваних елементів керування, таких як кнопка.
Поняття команд. WPF-події, що маршрутизуються
Загальні відомості про команди
У добре спроектованому застосунку Windows логіка застосунка перебуває не в оброблювачах подій, а закодована в методах, що більше мають високий рівень. Кожний із цих методів представляє одну «задачу» (task), розв'язувану застосунком.
Кожна задача може покладатися на додаткові бібліотеки (окремо скомпільовані компоненти, у яких інкапсулюється бізнес-логіка або доступ до бази даних). Приклад таких відносин показаний на ескізі. Найочевиднішим способом використання такого дизайну є додавання оброблювачів подій скрізь, де вони потрібні, і застосування кожного з них для виклику відповідного методу застосунка. Фактично, у такому разі код вікна перетворюється в полегшену комутаційну панель, що реагує на уведення й пересилає запити усередину застосунка. Хоча такий дизайн є цілком розумним, він не заощаджує ніяких зусиль. Багато задач застосунка можуть ініціюватися на різних маршрутах, через що все ж таки доводиться часто писати деклька оброблювачів подій, що викликають той самий метод застосунка. В цьому немає особливої проблеми (тому що код комутаційної панелі досить простий), але життя набагато ускладнюється, коли доводиться мати справу зі станом користувальницького інтерфейсу.
Зрозуміти, про що йде мова, допоможе простий приклад. Припустимо, що є програма, до складу якої входить метод з іменем PrintDocument(). Цей метод може ініціюватися чотирма способами: через головне меню (шляхом вибору в меню File (Файл) команди Print (Друк)), через контекстне меню (шляхом виконання клацання правою кнопкою миші в порожній області й вибору в контекстному меню, що з'явився, команди Print (Друк)), за допомогою клавіатурної комбінації (<Ctrl+P>) і за допомогою відповідної кнопки в панелі інструментів. У певних моментах життєвого циклу застосунку задача PrintDocument() повинна бути недоступної. Це має на увазі відключення відповідних команд у двох меню й кнопки в панелі інструментів таким чином, щоб на них не можна було виконувати клацання, а також ігнорування клавіатурної комбінації <Ctrl+P>. Написання коду, що робить це, (і додавання коду, що включає дані елементи керування пізніше) — дуже непростий підхід.
Навіть ще гірше те, що допущення в ньому помилки може призвести до того, що різні блоки коду стану будуть перекриватися неправильно, залишаючи елемент керування в активному стані навіть тоді, коли він не повинен бути доступний. Написання й налагодження подібного коду є одним з найменш приємних аспектів розробки Windows-застосунків. На диво багатьох досвідчених розроблювачів Windows-застосунків, у наборі інструментальних засобів Windows Forms не було ніяких функціональних можливостей, які могли б полегшувати виконання подібних операцій. Розроблювачі могли створювати необхідну їм інфраструктуру самостійно, але більшість із них воліло цього не робити.
На щастя, WPF заповнює цей пробіл, пропонуючи нову командну модель, що надає дві наступних важливих можливості:
- делегування подій відповідними командам;
- підтримка включеного стану елемента керування в синхронізованому виді за допомогою стану відповідної команди.
Модель команд WPF складається з великої кількості рухливих частин. Ключовими в ній є чотири такі компоненти:
- Команди. Команда представляє задачу застосунка й стежить за тим. коли вона може бути виконана. Однак коду, який виконує задачу застосунка, команди насправді не містять.
- Прив'язки команд. Кожна прив'язка (binding) має на увазі з'єднання команди з логікою, що має до неї відношення, застосунка, відповідальної за обслуговування певної області користувальницького інтерфейсу. Такий факторизований дизайн дуже важливий, тому що та сама команда може використовуватися в декількох місцях у застосунку й мати в кожному з них різне призначення. Для забезпечення подібного поводження саме й служать різні прив'язки однієї й тої ж команди.
- Джерела команд. Джерело команди ініціює команду. Наприклад, і елемент керування Menultem, і елемент керування Button можуть служити джерелами команд. Клацання на них у такому випадку буде приводити до виконання прив'язаної команди.
- Цільові об'єкти команд. Цільовий об'єкт команди — це елемент, для якого призначена дана команда, тобто елемент, на якому вона виконується. Наприклад, команда Paste може вставляти текст в елемент TextBox, а команда OpenFile — відображати документ в елементі DocumentViewer. Цільовий об'єкт може бути важливий, а може бути й неважливий, що залежить від природи команди.
Інтерфейс ICommand Серцем моделі команд WPF безумовно є інтерфейс System.Windows.Input.ICommand, що визначає спосіб, у відповідність із яким працюють команди. Цей інтерфейс включає два методи й подія:
public interface ICommand { void Execute(object parameter); bool CanExecute(object parameter); event EventHandler CanExecuteChanged; }
При створенні своїх власних команд реалізовувати інтерфейс ICommand прямо не обов'язково. Замість цього можна використовувати клас System.Windows.Input.RoutedCommand, що реалізує цей інтерфейс автоматично. Клас RoutedCommand є єдиним класом у WPF, що реалізує інтерфейс ICommand. Інакше кажучи, всі команди WPF являють собою екземпляри класу RoutedCommand (або похідного від нього класу). Одна із ключових концепцій, що лежать в основі моделі команд у WPF, полягає в тому, що клас RoutedCommand не містить ніякої логіки застосунка. Він просто представляє команду. Це означає, що один об'єкт RoutedCommand має ті ж можливості, що й інший. Якщо інтерфейс ICommand інкапсулює ідею команди — дії, що може ініціюватися й бути або не бути доступною, то клас RoutedCommand змінює команду так, щоб вона могла подібно бульбашці підніматися нагору ієрархією елементів WPF до відповідного оброблювача подій.
Більшість команд, з якими розробнику доведется мати справу, будуть не об'єктами RoutedCommand, а екземплярами класу RoutedUICommand, який успадковується від класу RoutedCommand. (Насправді всі заготовлені команди, які надає WPF. є саме об'єктами RoutedUICommand.)
Бібліотека команд
Розроблювачі WPF урахували той факт, що в кожному застосунку може використовуватися величезна кількість команд, і що багато команд можуть бути загальними для множини застосунків. Наприклад, у всіх застосунках, призначених для обробки документів, будуть присутні свої власні версії команд New (Створити), Open (Відкрити) і Save (Зберегти). Тому для зменшення обсягу зусиль, необхідних для створення таких команд, вони включили до складу WPF бібліотеку базових команд, у якій утримується понад 100 команд. Всі ці команди доступні через статичні властивості п'яти відповідних статичних класів.
- ApplicationCommands. Цей клас надає загальні команди, включаючи команди, пов'язані з буфером обміну (такі як Копіювати, Вирізати і Вставити), і команди, що стосуються обробки документів (New (Створити), Open (Відкрити), Save (Зберегти), SaveAs (Зберегти як), Print (Друк) і т. д.).
- NavigationCommands. Цей клас надає команди, використовувані для навігації, включаючи ті, що призначено для сторінкових застосунків (на зразок команди BrowseBack (Назад), BrowseForward (Уперед) і NextPage (Перехід)), і ті, що підходять для застосунків, призначених для роботи з документами (команди IncreaseZoom (Масштаб) і Refresh (Обновити)).
- EditingCommands. Цей клас надає довгий перелік команд, призначених у більшій мірі для редагування документів, включаючи команди для переміщення (MoveToLineEnd (Перехід у кінець рядка), MoveLeftByWord (Перехід уліво на одне слово), MoveUpByPage (Перехід на одну сторінку нагору) і т. д.), виділення вмісту (SelectToLineEnd (Виділення до кінця рядка), SelectLeftByWord (Виділення слова ліворуч)) і зміни форматування (ToggleBold і ToggleUnderline (Виділення напівжирним і підкресленням)).
- MediaCommands. Цей клас включає набір команд для роботи з мультимедія (серед яких команда Play (Відтворити). Pause (Пауза), NextTrack (Перехід до наступної композиції) і IncreaseVolume (Збільшення гучності)).
Відключення команд відбувається так:
CommandBinding binding = new CommandBinding (ApplicationCommands.Save); binding.Executed += SaveCommand_Executed; binding.CanExecute += SaveCommand CanExecute; this.CommandBindings.Add(binding);
У цьому оброблювачі подій потрібно просто перевірити значення змінної isDirty і встановити відповідне значення для властивості CanExecuteRoutedEventArg.CanExecute:
private void SaveCommand_CanExecute (object sender, CanExecuteRoutedEventArgs e) { e.CanExecute = isDirty; }
Якщо значенням властивості is Dirty виявляється false, команда відключається (робиться недоступною), а якщо true, то навпаки включається. (Без прапора CanExecute буде зберігатися саме останнє значення.)
Події, що маршрутизуються
Кожний розробник, що використовує .NET, знайоммий з поняттям події — це повідомлення, що посилається об'єктом (наприклад, елементом WPF), щоб повідомити код про те, що відбулося щось важливе. WPF поліпшує модель подій .NET завдяки новій концепції маршрутизації подій. Маршрутизація дозволяє події виникати в одному елементі, а генеруватися — в іншому. Наприклад, маршрутизація подій дозволяє клацанню, що почалося в кнопці панелі інструментів, генеруватися в панелі інструментів, а потім у вікні, що вміщає панель, і тільки потім оброблятися вашим кодом.
Маршрутизація подій пропонує більшу гнучкість для написання лаконічного коду, що зможе обробляти події в більше зручному для цього місці. Вона необхідна також для роботи з моделлю вмісту WPF. яка дозволяє створювати прості елементи (наприклад, кнопки) з десятків окремих інгредієнтів, кожний з яких має свій власний набір подій.
Ці події бувають трьох видів.
- Прямі події (direct event) подібні до звичайних подій .NET. Вони виникають в одному елементі, і не передаються в інший. Наприклад, MouseEnter (виникає, коли покажчик миші наводиться на елемент) є простою подією.
- Події, що піднімаються («бульбашкові» події, bubbling event), «мандрують» нагору ієрархією. Наприклад, MouseDown є подією, що піднімається. Вона виникає в елементі, на якому було зроблено клацання. Потім вона передається від цього елемента до батька, потім до батька цього батька, і так далі. Цей процес триває доти, поки WPF не досягне вершини дерева елементів.
- Тунельні події (tunneling event) переміщаються вниз ієрархією. Вони надають можливість попередньо переглядати (і, можливо, зупиняти) подію до того, як воно дійде до відповідного елемента керування. Наприклад, PreviewKeyDown дозволяє перервати натискання клавіші, спочатку на рівні вікна, а потім у більш специфічних контейнерах, до тих пір, поки ви не дійдете до елемента, що мав фокус у момент натискання клавіші.
Попри те, що кожний елемент має найширший спектр подій, найважливіші події звичайно діляться на чотири описаних нижче категорії.
Події часу існування
Ці події виникають, коли елемент ініціялізується, завантажується або вивантажується.
- Події миші. Ці події є результатом дій миші.
- Події клавіатури. Ці події є результатом дій клавіатури (наприклад, натискання клавіші).
- Події пера. Ці події є результатом використання пера (stylus).
Разом події миші, клавіатури й пера відомі як події введення.
Фокус
У світі Windows користувач може працювати одночасно з одним елементом керування. Елемент керування, що у цей момент часу одержує натискання клавіші користувачем, перебуває у фокусі. Іноді такий елемент вимальовується трохи інакше. Наприклад, кнопка WPF здобуває синій відтінок, щоб свідчить про те, що вона перебуває у фокусі. Щоб елемент керування міг одержувати фокус, його властивості Focusable потрібно привласнити значення true. За замовчуванням воно є таким для всіх елементів керування.
Досить цікаво те, що властивість Focusable визначається як частина класу UIElement, а це означає, що інші елементи, які не є елементами керування, теж можуть одержувати фокус. Звичайно в класах, які не визначають елементи керування, властивість Focusable за замовчуванням має значення false. Проте, ви можете привласнити йому true. Спробуйте зробити це на прикладі контейнера Stack Panel — коли він буде одержувати фокус, на краях панелі буде з'являтися пунктирна рамка.
Щоб перемістити фокус із одного елемента на іншій, користувач може клацнути кнопкою миші або скористатися клавішею <Tab> і клавішами керування курсором. У попередніх середовищах розробки програмісти додавали багато зусиль для того, щоб клавіша <Tab> передавала фокус «за законами логіки» (звичайно ліворуч праворуч, а потім долілиць вікна), і щоб при першому відображенні вікна фокус передавався необхідному елементу керування. В WPF така додаткова робота потрібно дуже рідко, оскільки WPF використовує ієрархічне компонування елементів для реалізації послідовності переходу за допомогою клавіші табуляції. Фактично, при натисканні клавіші <Tab>, здійснюється перехід до першого нащадка в поточному елементі або, якщо поточний елемент не має нащадка, до наступного нащадка, що перебуває на тому ж рівні.
Якщо ви хочете керувати послідовністю переходу за допомогою клавіші табуляції, ви можете задати властивість Tablndex кожного елемента керування, щоб визначити його місце в числовому порядку. Елемент керування, властивість Tablndex якого має значення 0, одержує фокус першим, потім фокус одержує елемент із більшим значенням цієї властивості (наприклад. 1.2. 3 і т. д.). Якщо кілька елементів мають однакові значення властивості TabIndex, WPF виконує автоматичну послідовність передачі фокуса, відповідно до якої фокус одержує найближчий елемент у послідовності.
Особливості прив'язки та взаємодії з даними
Прив'язка даних
Прив'язка даних- це традиція добування інформації з об'єкта й відображення її в користувальницькому інтерфейсі застосунка без написання коду, що виконує всю цю роботу. Часто «товсті» клієнти використовують двонаправлену прив'язку даних, що додає можливості — «заштовхування» інформації з користувальницького інтерфейсу назад в деякий об'єкт — знову ж таки, з мінімальним кодуванням, або взагалі без нього. Оскільки багато Windows-застосунків пов'язані з даними (і всі вони в певний час мають потребу у взаємодії з даними), прив'язка даних перебуває в центрі уваги такої технології користувальницьких інтерфейсів, як WPF. Розроблювачі, що прийшли до WPF з досвідом роботи в Windows Forms, знайдуть у прив'язці даних WPF багато схожого з тим, до чого вони звикли. Як і в Windows Forms, прив'язка даних WPF дозволяє створювати прив'язки, які витягають інформацію практично з будь-якої властивості будь-якого елемента. WPF також включає набір облікових елементів керування, які можуть обробляти цілі колекції інформації й дозволяють здійснювати навігацію по цій інформації. Однак відбулися й істотні зміни в способах прив'язки даних, що відбуваються «за лаштунками», з'явилася деяка вражаюча нова функціональність, а також можливості тонкого настроювання. Багато концепцій залишилися колишніми, але код змінився.
Найпростіший сценарій прив'язки даних складається в тому. що ваш вихідний об'єкт є елементом WPF, а вихідна властивість — властивістю залежностей. Це пояснюється тим, що властивості залежностей мають убудовану підтримку повідомлень про зміни. У результаті, коли ви міняєте значення властивості залежностей вихідного об'єкта, прив'язане властивість у цільовому об'єкті обновляється автоматично. Це саме те. що вам потрібно, і для цього не потрібно будувати ніякої додаткової інфраструктури. Щоб зрозуміти, як можна прив'язати один елемент до іншого, розглянемо приклад наступного вікна. Воно містить два елементи керування- Slider і TextBlock з єдиним рядком тексту. Якщо перетягнути бігунок вправо, розмір шрифту тексту негайно збільшиться. Якщо зрушити його вліво, розмір шрифту зменшиться. Ясно, що було б зовсім неважко запрограмувати таке поводження в коді. Для цього вам усього лише знадобилося б реагувати на подію ValueChanged і копіювати поточне значення бігунка в TextBlock. Однак прив'язка даних дозволяє зробити це ще простіше.
При використанні прив'язки даних вам не потрібно вносити ніяких змін у вихідний об'єкт (у цьому випадку- Slider). Просто сконфігуруйте його, щоб він приймав правильний діапазон значень, як це звичайно робиться:
<Slider Name="sliderFontSize" Margin="3" Minimum="l" Maximum="40" Value="10" TickFrequency="l" TickPlacement="TopLeft"> </Slider>
Прив'язка задається в елементі TextBlock. Замість установки FontSize із застосуванням літерального значення ви використовуєте вираження прив'язки, як показано нижче:
<TextBlock Margin="10" Text="Simple Text" Name="lblSampleText" FontSize="{Binding ElementName=sliderFontSize, Path=Value}" > </TextBlock>
Вираження прив'язки даних використовують розширення розмітки XAML (звідси й фігурні дужки). Вираження починається зі слова Binding, оскільки ви створюєте екземпляр класу System.Windows.Data.Binding. Хоча ви можете сконфігурувати об'єкт Binding декількома способами, у даній ситуації потрібно встановити всього дві властивості: ElementName, що вказує елемент-джерело, і Path, що вказує, яка саме властивість прив'язується елемента-джерела.
Варто наголосить на тому, що WPF не збуджує винятків, щоб сповістити вас про проблеми прив'язки даних. Якщо ви специфікуєте неіснуючий елемент або властивість, то не одержите ніякої вказівки на таку помилку — замість цього дані просто не з'являться в цільовій властивості.
Створення прив'язки в коді
При побудові вікна звичайно найкраще повідомляти ваше вираження прив'язки в коді розмітки XAML, використовуючи розширення Binding. Однак прив'язку можна також створити й у програмному коді.
От як можна створити прив'язку TextBlock. показану в попередньому прикладі:
Binding binding = new Binding ПРО ; binding.Source = sliderFontSize; binding.Path = new PropertyPath(«Value»); binding.Mode = BindingMode.TwoWay; IblSampleText.SetBinding(TextBlock.TextProperty, binding);
Якщо ви хочете видалити прив'язку, щоб установлювати значення властивості звичайним способом, вам знадобиться допомога методів ClearBinding() і ClearAllBindings().
Напрямок прив'язки
Дотепер ви познайомилися з односпрямованою й двонаправленою прив'язками. Насправді WPF дозволяє при установці властивості Binding. Mode застосовувати одне з п'яти значень перерахування System.Windows.Data.BindingMode. Oneway. Цільова властивість оновлюється при зміні властивості-джерела. TwoWay. Цільова властивість обновляється при зміні властивості-джерела, і властивість-джерело обновляється при зміні цільової властивості.
OneTime. Цільова властивість установлюється споконвічно на основі значення властивості-джерела. Однак із цього моменту зміни ігноруються (якщо тільки прив'язка не встановлена на зовсім інший об'єкт). Звичайно ви використовуєте цей метод для скорочення накладних витрат, якщо знаєте, що вихідна властивість не буде змінюватися.
OneWaySource. Подібно OneWay, тільки навпаки. Вихідна властивість оновлюється при зміні цільової властивості (що може здатися трохи «задом наперед»), але цільова властивість ніколи не оновлюється. Default. Тип прив'язки залежить від цільової властивості. Воно буде або TwoWay (для встановлюваних користувачем властивостей, таких як TextBox.Text), або OneWay (для всіх інших). Всі прив'язки використовують цей підхід, якщо тільки ви не вкажете іншої.
Прив'язка користувальницьких об'єктів до бази даних
Коли розроблювачі чують термін прив'язка даних, то вони часто думають про один специфічний її застосунок — одержанні інформації з бази даних і відображенні на екрані з мінімальним обсягом коду або взагалі без нього. Як ви вже бачили, прив'язка даних в WPF — набагато ширше поняття. Навіть якщо ваш застосунок ніколи не вступає в контакт із базою даних, все-таки зберігається ймовірність застосування прив'язки даних для автоматизації взаємодії елементів між собою або трансляції об'єктної моделі в наочне подання. Однак ви повинні знати багато подробиць про прив'язку об'єктів, для чого ми розглянемо традиційний приклад, що запитує й оновлює таблицю бази даних. Перш ніж звернутися до цього, вам належить довідатися про спеціальний компонент доступу до даних і об'єкті даних, використовуваному в цьому прикладі.
При створенні класу доступу до даних ви повинні слідувати декільком базовим правилам, які описані нижче. • Відкривати й закривати з'єднання швидко. Відкривайте з'єднання з базою даних при кожному виклику методу й закривайте перед завершенням методу. Таким чином, з'єднання не залишаться відкритими з необережності. Один зі способів гарантувати закриття з'єднання в належний час — використовувати блок using. • Реалізувати обробку помилок. Використовуйте обробку помилок, щоб гарантувати закриття з'єднань навіть у випадку виникнення винятків. • Додержуватися практики дизайну, що не підтримує стан. Передавайте всю необхідну для методу інформацію в його параметрах і повертайте всі витягнуті дані через значення повернення. Це дозволить уникнути ускладнень у багатьох сценаріях (наприклад, якщо ви хочете створити багатопотоковий застосунок або розташувати ваш компонент бази даних на сервері). • Зберігати рядок підключення в одному місці. В ідеалі такими місцями повинен бути конфігураційний файл вашого застосунка.
Прив'язка до вираження LINQ
Однієї із причин переходу від .NET 3.0 до .NET 3.5 є підтримка мови інтегрованих запитів (Language Integrated Query — LINQ). Використовуючи підтримку, включену в .NET 3.5. ви можете використовувати однаково структуровані запити LINQ для добування даних з колекції, що перебуває в пам'яті, з файлу XML або з бази даних SQL Server. Як і інші мови запитів. LINQ дозволяє фільтрувати, сортувати й трансформувати дані.
Хоча LINQ виходить за рамки теми, що розглядається в даному розділі, ви можете багато чого довідатися про нього із простого приклада. Наприклад, припустимо, що у вас є колекція об'єктів Product з іменем products, і ви хочете створити другу колекцію, що містить тільки ті продукти, ціна яких перевищує $100. Використовуючи процедурний код. Ви можете написати щось таке:
// Одержати повний список продуктів. List<Product> products = App.StoreDB.GetProducts(); // Створити другу колекцію з потрібні продуктам;:. List<Product> matches = new List<Product> (); foreach (Product product in products) if (product.UnitCost >= 100) matches.Add(product);
Використовуючи LINQ. ви можете написати наступне, набагато більше зручне вираження:
// Одержати повний список продуктів. List<Product> products = App.StoreDB.GetProducts(); // Створити другу колекцію з відповідними продуктами IEnumerable<Product> matches = from product in products where product.UnitCost >= 100 select product;
Цей приклад використовує API-Інтерфейс LINQ to Collections, тобто застосовує вираження LINQ для витягнення запиту даних, що знаходяться в пам'яті. Вираження LINQ використовують набір нових ключових слів мови, включаючи from, in і select. Ці ключові слова LINQ становлять невід'ємну частин мови С#.
Шаблони
Виявляється, що в кожного елемента керування є вбудований «рецепт», що визначає те, як він повинен візуалізуватись (у вигляді групи більше базових елементів).
Цей рецепт називається шаблоном елемента керування (control template) і визначається за допомогою блоку XAML-розмітки. Коли створюється шаблон елемента керування, новий шаблон заміняє існуючий повністю. Це забезпечує найвищий ступінь гнучкості, але при цьому також ще й трохи ускладнює життя. У більшості випадків перед створенням своєї власної адаптованої версії потрібно переглянути стандартний шаблон, що використовує даний елемент керування. У деяких випадках спеціальний шаблон елемента керування може повністю повторювати стандартний шаблон, за винятком якоїсь однієї незначної зміни.
У документації WPF код XAML стандартних шаблонів елементів керування не наведений. Однак всю необхідну інформацію можна одержати програмно. У цілому потрібно зробити наступне: витягти шаблон елемента керування з його властивості Template (яке є частиною класу Control) і потім серіялізувати його в XAML за допомогою класу XamlWriter.
Стилі
Стиль — це колекція значень властивостей, які можуть бути застосовані до елемента. Система стилів WPF грає ту ж роль, що й стандарт каскадних таблиць стилів (Cascading Style Sheet — CSS) грає в HTML-коді розмітки. Подібно до CSS, стилі WPF дозволяють визначати загальний набір характеристик форматування й застосовувати їх у всьому застосунку для забезпечення узгодженості. Як і CSS, стилі WPF можуть працювати автоматично, призначатися для елементів конкретного типу й каскадуватись через дерево елементів. Однак стилі WPF є могутнішими, тому що можуть установлювати будь-яку властивість залежностей.
Переваги стилів показані на наступному простому прикладі. Нехай треба стандартизувати використовуваний у вікні стиль. Найпростішим підходом буде встановити відповідальні за шрифт властивості утримуючий цей шрифт вікна. До числа таких властивостей, які, до речі, визначаються в класі Control, ставляться FontFamily. For.tSize. FontWeight (для шрифту з напівжирним накресленням). FoncStyle (для шрифту з курсивним накресленням) і Font St retch. Завдяки функції спадкування значень властивостей, при установці цих властивостей на рівні вікна всі елементи усередині вікна одержать однакові значення, якщо тільки вони явно не перевизначають їх.
Тепер давайте візьмемо іншу ситуацію. Уявіть, що потрібно заблокувати шрифт, використовуваний для якихось певних елементів у користувальницькому інтерфейсі. Якщо є можливість ізолювати ці елементи в спеціальний контейнер (наприклад, якщо вони все перебувають усередині одного елемента керування Grid або StackPanel). тоді в принципі можна скористатися тим же самим підходом і встановити відповідальні за шрифт властивості цього контейнера. Однак у реальному житті все зазвичай виявляється не так просто. Наприклад, може бути необхідно, щоб у всіх кнопок була своя гарнітура й розмір шрифту, що не залежить від параметрів шрифту, які використовуються в інших елементах. У такому випадку потрібний спосіб, що дозволяє визначити ці деталі в одному місці й повторно використовувати їх скрізь, де вони будуть необхідні.
Стилі пропонують ідеальне рішення. Можна визначити один єдиний стиль, що впаковує всі властивості, які потрібно встановити. Наприклад, можна надійти так, як показано нижче.
<Window.Resources> <Style x:Key="BigFontButtonStyle"> <Setter Property="Control.FontFamily" Value="Times New Roman" /> <Setter Property="Control.FontSize" Value="8" /> <Setter Property="Control.FontWeight" Value="Bold" /> </Style> </Window.Resources>
У цьому коді розмітки створюється один єдиний ресурс: об'єкт System.Windows. Style. У цьому об'єкті втримується колекція Setters із трьома об'єктами Setter, по одному для кожної властивості, що потрібно встановити. У кожному об'єкті Setter вказується ім'я властивості, на яке він впливає, і значення, що він повинен застосовувати до цієї властивості. Як і всі ресурси, об'єкт стилю має ключове ім'я, за яким його можна при необхідності витягати з колекції. У цьому разі це ключове ім'я виглядає як BigFontButtonStyle. (За загальноприйнятою згодою ключові імена стилів звичайно закінчуються словом «Style».) Система стилів додає безліч переваг. Вона не тільки дозволяє створювати групи параметрів, чітко зв'язаних між собою, але й також спрощує код розмітки, полегшуючи застосування цих параметрів. Найкраще те, що стиль можна застосовувати, не турбуючись про те, які властивості він установлює. У попередньому прикладі параметри шрифту були організовані в стиль за назвою BigFontButtonStyle. Якщо пізніше раптом знадобиться забезпечити кнопки з великим шрифтом областями Padding і Margin, у код можна буде також дуже легко додатково додати, відповідно, властивості Padding і Margin, після чого всі, що використовують даний стиль кнопки, автоматично одержать нові параметри стилю.
Колекція Setters є найважливішою властивістю класу Style. Але в принципі ключовими вважаються цілих п'ять властивостей, короткий опис яких наведено в табл.
Setters Колекція об'єктів Setter або EventSetter, які автоматично встановлюють значення властивостей і додають оброблювачі подій.
Triggers Колекція об'єктів, які успадковуються від TriggerBase і дозволяють автоматично змінювати параметри стилю. Параметри стилю можуть змінюватися, наприклад, або у випадку зміни значення якоїсь іншої властивості, або у випадку виникнення якої-небудь події.
Resources Колекція ресурсів, які повинні використовуватися зі стилями. Наприклад, може виникнути необхідність використовувати один єдиний об'єкт для установки більш ніж однієї властивості. У такому випадку більше ефективним варіантом буде створити об'єкт як ресурс і потім використовувати цей ресурс в об'єкті Setter (чим створювати його у вигляді частини кожного об'єкта Setter, використовуючи вкладені дескриптори). BasedOn Властивість, що дозволяє створювати більше спеціалізований стиль, що успадковує (і, при бажанні, що перевизначає) параметри іншого стилю.
TargetType Властивість, що ідентифікує тип елемента, на який діє даний стиль. Ця властивість дозволяє створювати як об'єкти Setter, що впливають тільки на певні елементи, так і об'єкти Setter, що автоматично вступають у силу для елементів конкретного типу.
Власне кажучи, застосовувати стилі й ресурси разом зовсім необов'язково. Наприклад, стиль певної кнопки можна визначити, і просто прямо заповнивши її колекцію Style, як показано нижче:
<Button Padding=5 Margin=5"> <Button.Style> <Style> <Setter Property="Control.FontFamily" Value="Times New Roman" /> <Setter Property="Control.FontSize" Value=8" /> <Setter Property="Control.FontWeight" Value="Bold" /> </Style> </Button.Style> <Button.Content>A Customized Button</Button.Content> </Button>
Автоматичне застосування стилів за типом
Поки що було показано, як можна створювати іменовані стилі й посилатися на них у коді розмітки. Однак існує ще один підхід. Можна робити так, щоб до елементів певного типу стиль застосовувався автоматично. Робиться це доволі просто. Усе, що потрібно- це встановити властивість TargetType так, щоб воно вказувало на потрібний тип (як описувалося раніше), і взагалі не використовувати ключове ім'я. Тоді WPF установлює ключове ім'я неявно за допомогою розширення розмітки типу, як показано нижче: х:Кеу="{х:Турі Button}"
Далі стиль автоматично застосовується до будь-яких кнопок, що зустрічаються нижче в дереві елементів. Наприклад, якщо визначити стиль подібним чином у вікні, він буде застосовуватися до кожної кнопки в цьому вікні (за умови відсутності далі в коді ще одного стилю, що заміняє його).
Хоча автоматично застосовувані стилі й зручні, вони можуть ускладнювати дизайн. Нижче перераховано кілька можливих причин.
- У складному вікні з великою кількістю стилів і рівнів стилів стає важко відслідковувати те, чи встановлюється дана властивість за допомогою спадкування значень властивостей або за допомогою стилю (і якщо воно встановлюється за допомогою стилю, то за допомогою якого саме). У результаті при необхідності змінити навіть яку-небудь просту деталь може знадобитися перегляд коду розмітки всього вікна.
- Форматування у вікні часто спочатку є більше загальним, а потім поступово ускладнюється. У разі застосування до вікна автоматичних стилів де-небудь на ранньому етапі, швидше за все, далі ці стилі буде потрібно перевизначати в багатьох місцях за допомогою явних стилів. А це значно ускладнює весь дизайн. Набагато простіше буде створити іменовані стилі для кожної комбінації необхідних характеристик форматування й застосовувати їх за іменем.
- У разі створення автоматичного стилю, наприклад, для елемента TextBox, обов'язково прийдеться вносити зміни в інші елементи керування, які використовують цей елемент TextBlock (наприклад, у керований шаблоном елемент керування ListBox).
Щоб уникнути таких проблем, найкраще застосовувати автоматичні стилі розважливо. Наприклад, може виявитися найкраще використовувати автоматичний стиль не для всього вікна, а тільки для додання одноманітного заповнення кнопкам або для керування параметрами полів елементів TextBox у конкретному контейнері.
Локалізація
Локалізація WPF-застосунків концептуально відрізняється від підходу до багатомовності інтерфейсів у WinForms. Тут одиницею локалізації є XAML-файл (з технічної точки зору — скомпільований BAML-pecypc. який вбудовується в застосунок). При бажанні підтримувати три різні мови, необхідно буде включити три BAML-pecypca. WPF буде вибирати з них відповідний на підставі поточних настроювань культури на тому комп'ютері, на якому виконується застосунок. (З технічної точки зору WPF буде використовувати для прийняття рішення значення властивості CurrentUICulture з потоку користувацького інтерфейсу).
Звичайно, у такому процесі не було б особливого змісту, якби потрібно було створювати (і розгортати) універсальне складання з усіма локалізованими ресурсами.
Це було б не краще, ніж створювати окремі версії застосунка для кожної мови, оскільки застосунок доводилося би повністю компонувати заново при кожній необхідності додати підтримку для якоїсь нової культури (або необхідності настроїти текст в одному із уже існуючих ресурсів). На щастя, в. NET ця проблема вирішується за допомогою підлеглих збірок (satellite assemblies), які працюють із застосунком, але зберігаються в окремих каталогах. При створенні локалізованого WPF-застосунка кожний локалізований BAML-pecypc міститься в окремій підлеглій збірці. Для того щоб застосунок міг використовувати цю збірку, її розміщують в підпапці під основною папкою застосунка, наприклад, з іменем fr-FR, призначеної для французької мови (Франція). Після цього застосунок може зв'язуватися із цією підлеглою збіркою автоматично шляхом використання технології зондування (probing), що є частиною .NET Framework, починаючи з версії 1.0.
Найбільші труднощі в локалізації застосунка полягають у робочому процесі — іншими словами в тому, як витягти XAML-файли із проекту, зробити їх локалізованими, скомпілювати в підлеглі складання й потім повернути назад в застосунок. Створення локалізованих користувальницьких інтерфейсів
Перш ніж починати що-небудь перекладати, спочатку потрібно розібратися з тим, як застосунок буде реагувати на зміну вмісту. Наприклад, якщо подвоїти довжину всього тексту в користувальницькому інтерфейсі, то як зміниться загальне компонування вікна? У випадку якщо було розроблене дійсно гнучке компонування, ніяких проблем виникнути не повинне. Інтерфейс повинен бути здатний підбудуватися відповідно до динамічного вмісту. Нижче описані деякі рекомендації, що гарантують коректне відображення локалізованих елементів.
- Не застосовувати жорстко закодовані значення ширини або висоти.
- Установлювати для властивості Window.SizeToContent значення Width, Height або WidthAndHeight, так щоб розмір вікна міг збільшуватися в міру необхідності. (Знов-таки, це є обов'язковим не завжди; все залежить від структури вікна, але в деяких випадках буває дуже навіть корисним.)
- Використовувати для впакування великих обсягів тексту елемент ScrollViewer.
Підготовка застосунка для локалізації
Наступний крок — включити підтримку локалізації для проекту. Для цього буде потрібно внести тільки одну зміну, а саме — додати у файл .csproj проекту де-небудь у першому розділі <PropertyGroup> наступний елемент:
<UICulture> uk-UK</UICulture>
Це вкаже компіляторові, що мовою (культурою) за замовчуванням для застосунка повинен бути, наприклад, українська (при необхідності можна вибрати й іншу мову). Після внесення цього коректування процес компонування зміниться. При наступній компіляції застосунка буде створений підкаталог з іменем uk-UK. Усередині цієї папки буде перебувати підлегла збірка з таким же іменем, як і в застосунка, і розширенням .resources.dll (наприклад. LocalizableApplication.resources.dll).
У цьому складанні будуть утримуватися всі скомпільовані BAML-ресурси для застосунка, які раніше зберігалися в основному складанні застосунка.
Тепер при запуску даного застосунка загальномовне виконуюче середовище (CLR) буде автоматично шукати підлеглі складання у відповідному каталозі на підставі регіональних параметрів комп'ютера, і завантажувати відповідний локалізований ресурс. Наприклад, при запуску застосунка на комп'ютері з культурою fr-FR, середовище CLR буде відшукувати підкаталог fr-FR і використовувати підлеглі складання, які виявить там. Це означає, щоб додати в локалізований застосунок підтримку для додаткових культур, буде потрібно просто додати відповідні додаткові підкаталоги й підлеглі збірки, не турбуючись про вихідний виконуваний файл.
Коли середовище CLR починає зондувати підкаталоги на предмет наявності підлеглої збірки, воно слідує кільком простим правилам черговості.
- Спочатку воно перевіряє найспецифічніший із всіх доступних каталогів. Це означає, що воно шукає підлегле складання, призначене і для поточної мови, і регіону (на зразок fr-FR).
- Якщо йому не вдається відшукати такий каталог, воно починає шукати підлеглу збірку, призначену для поточної мови (такого як fr).
- Якщо йому не вдається знайти і такий каталог, тоді воно генерує виняток IOException.
Цей список є трохи спрощеним. Тим, хто вирішить застосовувати глобальний кеш збірок (Global Assembly Cache — GAC) для спільного використання якихось компонентів у всьому комп'ютері, варто знати, що .NET фактично перевіряє GAC на початку кроків 1 і 2. Інакше кажучи, на першому кроці CLR-середовище перевіряє, чи немає потрібної версії складання у кеші GAC, і якщо є, використовує його. Те ж саме відбувається й на кроці 2.
Процес перекладу
Коли вся необхідна для локалізації інфраструктури готова, залишається тільки створити відповідні підлеглі складання з альтернативними версіями вікон (у формі BAML) і розмістити їх у відповідних каталогах.
- Ви позначаєте в застосунку елементи, які потрібно локалізувати. При бажанні ви можете також додати додаткові коментарі для того, щоб допомогти перекладачеві.
- Далі ви витягуєте локалізовані деталі у файл .cvs (текстовий файл із роздільниками комами) і відправляєте його перекладачеві.
- Після одержання перекладеної версії цього файлу ви знову запускаєте утиліту locbaml, щоб згенерувати необхідне підлегле складання.
Перше, що потрібно зробити — додати в усі елементи, які потрібно локалізувати, спеціальний атрибут Uid. Наприклад:
<Button x:Uid="Button1" Margin="10" Padding=3">A button</Button>
Атрибут Uid відіграє роль подібну тієї. що виконує атрибут Name — у цьому випадку він унікальним чином ідентифікує кнопку в контексті одного XAML-документу. Це дозволяє вказати локалізований текст тільки для цієї кнопки. Однак існують кілька причин того, чому в WPF використовується атрибут Uid, а не значення Name, одна з яких полягає в тому, що елементові керування ім'я може не призначатися, а встановлюватися відповідно до різних домовленостей і застосовуватися в коді. Насправді властивість Name є таким фрагментом інформації, що локалізується.
Хоча й необов'язково, але атрибут Uid найкраще додати до кожного елемента в кожному вікні застосунка, який локалізується. Це може створити масу додаткових зусиль, однак існує утиліта msbuild.ехе, що вміє робити це автоматично. Потрібно просто використовувати її в такий спосіб:
msbuild /t:updateuid LocalizableApplication.csproj
Тут передбачається, що атрибути Uid потрібно додати в застосунок за назвою LocalizableApplication. Якщо потрібно перевірити, чи у всіх елементів є атрибути Uid (і чи не був який-небудь із них випадково продубльованим), можна використати утиліту msbuild.exe у такий спосіб:
msbuild /t:checkuid LocalizableApplication.csproj
У разі генерації атрибутів Uid за допомогою msbuild, вони встановлюються відповідно до імені елемента керування, до якого ставляться.
Для отримання вмісту всіх елементів служить утиліта командного рядка locbaml. У цей час locbaml не поставляється як скомпільований засіб. Замість цього її вихідний код доступний у вигляді зразка (у довідці Visual Studio, у присвяченому locbaml розділі) і повинен компілюватися вручну.
Використовуючи locbaml, варто обов'язково перебувати саме в тій папці, у якій утримується скомпільоване складання (наприклад, це може бути папка LocalizableApplication\bin\Debug). Щоб витягти список деталей для локалізації, потрібно вказати locbaml на підлеглу збірку й задати параметр /parse, як показано нижче: locbaml /parse en-US\LocalizableApplication.resources.dll
Утиліта locbaml виконує в підлеглі збірці пошук всіх наявних у ній скомпільованих BAML-ресурсів і генерує файл .cvs з деталями. У даному прикладі цей файл .csv одержить ім'я LocalizationApplication.resources.csv.
Кожний рядок у отриманому файлі представляє одну властивість для локалізації, що застосовувалося для того або іншого елемента в документі XAML, і складається із семи перерахованих нижче значень.
- Ім'я BAML-pecypca (наприклад. LocalizableApplication.g.en-US.resources: windowl.baml).
- Uid елемента й ім'я властивості, що підлягає локалізації. Наприклад: StackPanel_l: System.Windows.FrameworkElement.Margin.
- Категорія локалізації. Це значення береться з перерахування LocalizationCategory, яке допомагає ідентифікувати тип умісту, що представляється даною властивістю, (довгий текст, заголовок, шрифт, напис на кнопці, що спливає, підказка й т.д.).
- Значення, що показує, чи є дана властивість прочитною (тобто представленим у вигляді тексту в користувальницькому інтерфейсі). Всі прочитні значення повинні локалізуватися завжди, у той час як нечитні значення можуть вимагати, а можуть і не вимагати локалізації.
- Значення, що показує, чи можна значення даної властивості змінювати перекладачеві. Завжди виглядає як true, якщо тільки його спеціально не змінити на протилежне (false).
- Додаткові коментарі, які були надані для перекладача. Якщо коментарі не надавалися, це значення буде порожнім.
- Значення властивості. Це саме та деталь, що і повинна локалізуватися.
Тепер ви має нагоду відкрити згенерований файл у текстовому редакторі й замінити (перекласти) необхідний текстовий контент у відповідну мову, зберігши переклад у новий файл.
Тепер можна переходити до створення підлеглих збірок для інших культур. Знов-таки, для виконання цієї задачі потрібна утиліта locbaml, але цього разу її варто використовувати з параметром /generate.
Не забувайте про те, що підлегле складання буде містити альтернативну копію кожного цілого вікна у вигляді вкладеного BAML-pecypca. Для того щоб створити такі ресурси, утиліта locbaml повинна переглянути вихідну підлеглу збірку, замінити всі нові значення з переведеного файлу .cvs і потім згенерувати нову підлеглу збірку. А це означає, що ви повинні вказати утиліті locbaml на вихідну підлеглу збірку й (за допомогою параметра /trans:) на перекладений список значень. Ви також повинні повідомити її, яку культуру представляє це складання (за допомогою параметра /cul:). Майте на увазі, що культури визначаються за допомогою двоскладних ідентифікаторів, які перераховані в описі класу System.Globalization.Culturelnfo.
Нижче показаний приклад, що ілюструє все це:
locbaml /generate en-US\LocalizableApplication.resources.dll /trans:LocalizableApplication.resources.French.csv /cul: fr-FR /out: fr-FR
Ця команда робить описані нижче речі.
- Використовує вихідне підлегле складання en-US\LocalizedApplication. resources.dll.
- Використовує перекладений . cvs-файл French.cvs.
- Використовує культуру «французька мова (Франція)».
- Розташовує результат у підпапку fr-FR (яка повинна вже існувати). Хоча може здатися, що це повинне виконуватися неявним чином на підставі використовуваної культури, однак, дану деталь все-таки варто надавати обов'язково.
При виконанні цієї команди утиліта locbaml створить нову версію складання LocalizableApplication.resources.dll з перекладеними значеннями й помістить її в підпапку застосунку з іменем f r-FR.
Тепер, у випадку запуску даного застосунка на комп'ютері, де для параметра культури встановлена французька мова (Франція), автоматично з'явиться альтернативна версія вікна. Змінити культуру можна в доступному через панель керування розділі Regional and Language Options (Мова й регіональні стандарти) або. за допомогою коду, що змінює параметр культури тільки поточного потоку. Наприклад,
Thread.CurrentThread.CurrentUICulture = new CultureInfo(«fr-FR»)
Трансформація
Величезний обсяг завдань, пов'язаних з малюванням, може бути спрощений завдяки використанню трансформації — об'єкта, що змінює спосіб малювання фігури або елемента за допомогою схованого зрушення використовуваної їм координатної системи. B WPF трансформації представлені класами, успадкованими від абстрактного класу System.Windows.Media.Transform.
Мають місце такі трансформації:
- TranslaceTransform — зміщає вашу координатну систему на певну х, у величину. Ця трансформація зручна, якщо ви хочете намалювати ту ж фігуру в різних місцях;
- RotateTransform — повертає вашу координатну систему на Angle градусів, намальовані фігури повертаються навколо заданої точки Center. Саме параметр кута анімується від 0 до 360 градусів у даному прикладі;
- ScaleTransform — масштабує координатну систему в більшу або меншу сторону. Можна застосовувати різний ступінь масштабування за вимірами X і Y, таким чином розтягуючи або стискаючи фігуру;
- SkewTransform — деформує координатну систему, нахиляючи її на певне число градусів. Наприклад, якщо намалювати квадрат, то після трансформації він стане паралелограмом;
- MatrixTransform — модифікує координатну систему, використовуючи матричне множення на призначену матрицю. Це найскладніша трансформація — вона вимагає певної математичної підготовки.
- TransformGroup — комбінує кілька трансформацій таким чином, — що вони можуть застосовуватися одночасно. Порядок застосування трансформацій важливий — він впливає на кінцевий результат. Наприклад, обертання фігури (за допомогою RotateTransform) з наступним переміщенням її (за допомогою TransiateTransform) перемістить фігуру в інше місце, чим якщо ви спочатку перемістите її, а потім повернете.
Анімація
Анімація — центральна частина моделі WPF. Це значить, що вам не потрібно використовувати таймери й код обробки подій, щоб привести її в дію. Замість цього ви створюєте її декларативно, не написавши жодного рядка коду С#. Також анімація зовсім непомітно сама інтегрується у звичайні вікна WPF і на сторінки. Наприклад, якщо ви анімуєте кнопку таким чином, що вона дрейфує вікном, проте, вона при цьому продовжує поводитися як кнопка. Її можна стилізувати, вона приймає фокус і на ній можна клацнути, запустивши звичайний код оброблювача події.
Уявіть приклад украй простої анімації, що розширює кнопку. Коли ви клацаєте на кнопці. WPF плавно розсовує обидві сторони кнопки, поки вона не заповнить вікно.
Щоб створити такий ефект, ви використовуєте анімацію. що модифікує властивість Width кнопки. Нижче наведений код. що створює й запускає цю анімацію при клацанні на кнопці.
DoubleAnimation widthAnimation = new DoubleAnimation() ; widthAnimation.From = 160; widthAnimation.To = this.Width — 30; widthAniamtion.Duration = TimeSpan.FromSeconds(5); cmdGrow.BeginAnimation(Button.WidthProperty, widthAnimation);
Є три деталі, які становлять необхідний мінімум для опису анімації, що використовує лінійну інтерполяцію: початкове значення (From), кінцеве значення (To) і час, за яке анімація повинна виконатись (Duration). У даному прикладі кінцеве значення засноване на поточній ширині утримуючу кнопку вікна.
Бітові ефекти
Бітові ефекти WPF — готові візуальні ефекти, які можна застосувати до будь-якого елемента. Ціль ефектів — надати простий декларативний спосіб удосконалення зовнішнього вигляду тексту, зображень, кнопок тощо. Замість написання власного коду малювання ви використовуєте один із класів-спадкоємців BitmapEffect (із простору імен System.Windows.Media.Effects), щоб одержати миттєвий ефект типу розмивання, відблисків і тіней. Мають місце такі ефекти:
- BlurBitmapEffect — розмиває вміст елемента;
- BevelBitmapEffect — додає опуклу рамку навколо вмісту. Цей ефект реалізовано стосовно кнопок «Гаразд» та «Відміна»;
- EmbossBitmapEffect — створює ефект «тиснення», виділяючи границі й лінії, як якби вони були вирізані або видавлені;
- OuterGlowBitmapEffect — додає кольорове сяйво навколо вашого вмісту. Якщо якийсь елемент управління є активним, то можна звернути увагу на цей ефект;
- DropShadowBitmapEffect — додає прямокутну тінь, що, за вашим елементом.
- BitmapEffectGroup Застосовує комбінацію бітових ефектів. Порядок вказівки ефектів має значення, оскільки кожний застосовується поверх існуючих. BitmapEf fectGroup використовується рідко, оскільки множить накладні витрати. Інакше кажучи, кнопка із чотирма ефектами вимагає вчетверо більше обробки, чим кнопка з одним ефектом.
Переваги та особливості тривимірної графіки
Підтримка тривимірної графіки — одна з перлин платформи WPF. Попередні високорівневі набори інструментів розробки, такі як Windows Forms, взагалі обходилися без підтримки 3-D, залишаючи її фанатам Direct. Фактично найбільше вражає в тривимірних засобах WPF простота роботи з ними. Хоча можна створити складний код. що генерує і модифікує тривимірні сітки із залученням серйозного математичного апарату, але з тим же успіхом можна просто експортувати тривимірні моделі з інструменту проектування й маніпулювати ними за допомогою простих трансформацій. Ключові засоби забезпечуються високорівневими класами, що не вимагають глибоких знань.
Попри те, що модель тривимірної графіки WPF одразу ясна й погоджена, створення багатих тривимірних інтерфейсів залишається досить складною задачею. Для того щоб вручну закодувати тривимірну анімацію (або навіть просто зрозуміти покладені в її основу концепції), вам знадобиться щось більше, ніж трохи математики. А моделювання чого-небудь, крім найтривіальніших тривимірних сцен на основі вручну написаного коду XAML — це величезна робота, набагато більше складна, ніж двовимірний еквівалент ручного створення векторного зображення XAML. Із цієї причини, швидше за все, вам варто звернутися до інструментів від незалежних розроблювачів для створення тривимірних об'єктів, експортувати їх в XAML. а потім додавати до своїх застосунків.
Тривимірна графіка в WPF містить у собі такі інгредієнти:
- вікно перегляду (viewport), що містить ваш тривимірний вміст:
- тривимірний об'єкт:
- джерело світла, що висвітлює частину вашої тривимірної сцени:
- камера, що представляє точку, з якої ви спостерігаєте тривимірну сцену.
Звичайно, найскладніші тривимірні сцени будуть містити множину об'єктів і можуть включати множину джерел світла. (Можна також створити тривимірний об'єкт, що не вимагає джерела світла, якщо він сам є таким.) Однак перераховані інгредієнти являють собою гарний початко.
Вікно перегляду може містити в собі будь-який тривимірний об'єкт, успадкований від класу Visual3D (із простору імен System.Windows.Media.Media3D. у якому перебуває переважна більшість тривимірних класів).
Щоб побудувати тривимірний об'єкт, треба почати з побудови геометрії. для цієї мети існує тільки один клас — MeshGeometry3D. Не дивно, що об'єкт MeshGeometry3D представляє сітку (mesh). Якщо раніше ви мали справу із тривимірним малюванням (або читали що-небудь про технології, покладених в основу сучасних відеокарт), то вже повинні знати, що комп'ютери воліють будувати тривимірні об'єкти із трикутників. Це пояснюється тим. що трикутники — це найпростіший, найдокладніший спосіб опису поверхні.
Трикутники прості, тому що кожний з них визначається всього трьома точками (вершинами в кутах). Дуги й криві поверхні виразно більше складні. Трикутники докладні, тому що всі інші фігури із прямими гранями (квадрати, прямокутники й більше складні багатокутники) можуть бути розбиті на колекції трикутників. Добре це або погано, але сучасне апаратне забезпечення графіки і її програмування будується на основі цієї базової абстракції.
Визначивши потрібну властивість MeshGeometry3D, потрібно помістити його в оболонку GeometryModel3D. Клас GeometryModel3D має тільки три властивості: Geometry, Material і BackMaterial. Властивість Geometry приймає MeshGeometry3D, що визначає фігуру вашого тривимірного об'єкта. На додаток можна застосовувати властивості Material і BackMaterial для визначення поверхонь, з яких складається ваша фігура. Поверхня важлива через дві причини. По-перше, вона визначає колір об'єкта (хоча можна використовувати й складніші кисті, що малюють текстури замість суцільного кольору). По-друге, вона визначає те, як матеріал реагує на світло. WPF включає чотири класи матеріалів, кожний з яких успадковується від абстрактного класу Material із простору імен System.Windows.Media.Media3D. Цими матеріалами є DiffuseMaterial (створює пласку матову поверхню, що розподіляє світло рівномірно у всіх напрямках), SpecularMaterial (створює блискучу безбарвну поверхню (типу металу або скла). Відбиває світло в протилежному напрямку подібно дзеркалу.), EmissiveMaterial (створює розпечену поверхню, що сама випромінює світло, хоча це світло не відбивають інші об'єкти сцени), MaterialGroup (дозволяє комбінувати більше одного матеріалу. Матеріали, що комбінуються накладаються один на одного в тім порядку, у якому додавалися до MaterialGroup).
Щоб створити реалістично пофарбовані тривимірні об'єкти, WPF використовує модель висвітлення. Основна ідея в тому, що ви додаєте один (або трохи) джерел світла до тривимірної сцени. Характер висвітлення ваших об'єктів залежить від обраного типу джерела світла, його положення, напрямку й інтенсивності.
Перш ніж поринути у вивчення висвітлення WPF, важливо зрозуміти, що модель висвітлення WPF поводиться не так. як світло в реальному світі. Хоча система висвітлення WPF і призначена для того, щоб емулювати реальний світ, обчислення правильного відбиття — задача, що вимагає серйозних обчислювальних ресурсів. WPF допускає ряд спрощень, що гарантують практичність моделі висвітлення, навіть у випадку анімованих тривимірних сцен з декількома джерелами світла. До таких спрощень ставляться перераховані нижче.
- Світлові ефекти обчислюються для об'єктів індивідуально. Світло, відбите від одного об'єкта, не відбивається в іншому об'єкті. Аналогічно, об'єкт не відкидає тіні на інший об'єкт, незалежно від його місця розташування.
- Освітленість обчислюється для вершин кожного трикутника, а потім інтерполюється по його поверхні. (Іншими словами, WPF визначає інтенсивність світла в кожному куті, а потім згладжує його для заповнення всього трикутника.) У результаті такого дизайну об'єкти, що складаються з відносно невеликого числа трикутників, можуть бути освітлені неправильно. Щоб забезпечити краще висвітлення, вам належить ділити ваші фігури на сотні або навіть тисячу трикутників.
Класи джерел світла
- DirectionalLight Заповнює сцену паралельними променями світла, що йдуть у зазначеному вами напрямку.
- AmbientLight Наповнює сцену розсіяним світлом.
- PointLight Світло поширюється в усі сторони із точкового джерела.
- SpotLight Світло поширюється з однієї крапки по конусі.
Перш ніж тривимірна сцена буде відображена, вам потрібно розташувати камеру в коректній позиції і орієнтувати неї в правильному напрямку. Це робиться установкою у властивість Viewport3D.Camera об'єкта Camera. Вибір правильної камери — відносно проста задача, але розміщення й конфігурування її- трохи складніше. Перше, що потрібно, це специфікувати — крапку в тривимірному просторі, де буде позиціонована камера, установивши значення її властивості Position. Другий крок — установка тривимірного вектора у властивості LookDirection, що вказує орієнтацію камери. У типовій тривимірній сцені камера розміщається ледве далі одного з кутів сцени через властивість Position, а потім нахиляється для одержання необхідного виду за допомогою властивості LookDirection.
Звичайно, це лише першочерговий огляд тривимірних можливостей. Найпростіші приклади 3D-ефектів, а тим паче огляд вісіх концептуальних можливостей без перебільшення виходить за рамки представленого матеріалу.
Аспекти версії WPF 4.0 у MicroSoft Visual Studio 2010
12 квітня у світ має вийти MS Visual Studio 2010 — ще новіший, досконаліший та функціональніший інструмент для розробки windows-застосунків, в тому числі і за допомогою платформи WPF. У версії WPF4 міститимуться наступні можливості.
WPF4 додає різноманітні елементи керування, щоб створювати бізнес-застосунка ще швидше й простіше. Новий набір елементів керування включає такі необхідні елементи керування, як DataGrid, DatePicker і Calendar.
Windows 7 і елемент керування Office Ribbon
Він підтримує всі стандартні можливості, з якими знайомий кінцевий користувач: закладки й групи, динамічна зміна розмірів, панель швидкого доступу, меню застосунка, закладки, що залежать від контексту, гарячі клавіші й багато чого іншого.
Кешовані застосунки
Величезний виграш у продуктивності доступний з новою можливістю WPF4 — Cached Composition, що дозволяє застосункам кешувати довільний вміст, включаючи «живі» і повністю інтерактивні елементи керування, векторну геометрію, растрові зображення, що зберігаються у відеопам'яті й т.п. Помістивши один раз елементи в кеш, вони можуть бути довільно перетворені, анімовані, керовані, до них можна застосувати Effects, без необхідності перемальовувати закешовані елементи. Все це приводить до збереження CPU і GPU від перемальовування вмісту й дозволяє GPU перемальовувати прямо з кешу. Кеш розуміє «брудні» області, тому курсор, що блимає, у закешованому текстовому блоці, наприклад, повинен буде перемалювати тільки курсор між фреймами. З'явилася навіть нова кисть, що використовує «розумний» кеш, фактично це VisualBrush з поліпшеною продуктивністю.
Функції для полегшення анімації
Дискретна, лінійна й сплайнова анімація вже підтримується попередніми версіями WPF. WPF4 представляє новий концепт «Easing Functions», які дозволяють розробникам створювати різну анімацію. Наприклад, пружинисті рухи. Функції спрощення (Easing Functions) визначають спосіб анімації від початку й до кінця. Убудовані функції спрощення надають спектр режимів в анімації: кругової, експонентної, еластичної й пружинистої. Функції спрощення спроектовані легкорозширюваними, дозволяючи розробникам створювати власні. Завдяки даному нововведенню дизайнери можуть без зусиль створювати плавну й органічну анімацію. Новий стек для промальовування тексту WPF був повністю заміненим, що призвело до істотних удосконалень у чіткості промальовування тексту, здатності до зміни настроювань і підтримки міжнародних мов. Цей новий текстовий стек підтримує оптимізований символьний шар, щоб показувати текст із порівнянною різкістю тексту в Win32/GDI:
Так само новий стек підтримує явно обрані режими промальовування тексту: aliased, grayscale, ClearType.
Новий текстовий стек дозволяє оптимізувати текстову прив'язку для анімації й статики. До того ж, новий текстовий стек підтримує шрифти з убудованими картами зображень, що дозволяє багатьом східно-азійським шрифтам промальовуватись із чіткістю, до якої звикли користувачі Win32.
Власні словники
WPF містить у собі перевірку орфографії, що до 4-ї версії використовувала словники, надавані ОС. Це було великою проблемою для застосунків, які використовують специфічну термінологію, дані застосунки набридали постійними повідомленнями про неправильне написання. WPF4 представляє API, що дозволяє застосункам додавати слова в словники, використовувані WPF для перевірки орфографії. http://blogs.msdn.com/text/archive/2009/10/02/custom-dictionaries.aspx [ 18 січня 2010 у Wayback Machine.] Windows 7.
Підтримка мультитач
З поданням мультитач уведення й підтримки маніпулюванням обробки, WPF4 надає відмінний спосіб додати пікантності у ваш клієнтський застосунок в Windows 7. З'явилися нові події маніпуляції й інерції: мультитач події Manipulation, Inertia (Pan, Zoom, Rotate) над UIElement; прості мультитач події (Up, Move, Down) над UIElement, UIElement3D і ContentElement; захоплення декількох елементів керування; підтримка мультитач в ScrollViewer; розширюваність сенсорних пристроїв; сумісність із Surface SDK у майбутньому.
Інтеграція c Windows 7 інтерфейсом. WPF 4 надає нового й ключового функціоналу в Windows 7 для WPF розроблювачів. Нова панель задач захаращена й може передавати більше інформації. Aero-піктограми підтримують користувальницькі команди. Jump List забезпечує доступ до контекстуального запуску задач і файлів для застосунку. WPF 4 інтегрується з функціональністю Windows 7 Jump List, включаючи задачі, елементи, список недавно відкритих і часто використовуваних елементів, власні категорії. Інтеграція з панеллю задач Windows 7, включаючи, індикатор прогресу, іконки накладення, кнопки з мініатюрами з підтримкою команд, текст опису для мініатюр у менеджері вікон.
В Windows 7 панель задач була повністю перероблена для зменшення захаращення й поліпшення допомоги користувачеві у виконанні задач у кілька кліків. WPF4 надає інтеграцію з панеллю задач Windows 7 в XAML, дозволяючи застосункам виводити корисну інформацію користувачеві через іконки в панелі задач, використовуючи іконки накладення, індикатор прогресу, панель іконок, текст опису іконок і мініатюр вікон у панелі задач. Так само з'явився новий клас TaskbarItemInfo, що розширений, як властивість залежностей. Він містить у собі всі нові особливості панелі задач в Windows7.
Накладення іконки
Накладення іконки (Icon Overlays) дозволяють застосунку виводити певні повідомлення й стан користувачеві через власну кнопку в панелі задач, відображаючи невелике накладення, що з'являється в нижньому правому куті кнопки.
Індикатор прогресу. Кнопка в панелі завдань може бути використана для відображення простої інформації про прогрес, не змушувати користувача зайвий раз відкривати вікно для перегляду стану. Індикатор прогресу може бути використаний для відстеження процесу копіювання файлів, завантаження, інсталяції, запису даних на диск або іншої операції, що займає певний відрізок часу.
Новий рушій XAML/BAML-парсера. В WPF 4 була замінена реалізація XamlReader.Load(), BAML-завантаження, функціональність Control & DataTemplate новим рушієм, побудованим на основі нового System.Xaml.dll. Microsoft виправила багато помилок і додала багато нових функціональних поліпшень. Користувачі XamlReader.Load() можуть скористатися декількома новими особливостями мови в XAML2009, такими як підтримка генерик-типів. MarkupExtensions і TypeConverters можуть уже зараз одержувати доступ до багатьох сервісів через створення об'єктного графа, дозволяючи виконувати більше сценаріїв, як доступ до Root-об'єкта. Буде ще простіше створити інструменти для аналізу й маніпулювання XAML з новим низькорівневим API, наданим у System.Xaml.dll.
Див. також
Ця стаття потребує додаткових для поліпшення її . (травень 2015) |
Цю статтю треба для відповідності Вікіпедії. (травень 2015) |
Це незавершена стаття про інформаційні технології. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Windows Presentation Foundation WPF kodova nazva Avalon grafichna prezentacijna pidsistema analog WinForms yaka pochinayuchi z NET Framework 3 0 v skladi ciyeyi platformi Maye pryame vidnoshennya do XAML WPF razom z NET Framework 3 0 vbudovana v Windows Vista a takozh dostupna dlya ustanovki v Windows XP Service Pack 2 i Windows Server 2003 Ce pershe realne onovlennya tehnologichnogo seredovisha priznachenogo dlya koristuvacha interfejsu z chasu vipusku Windows 95 Vono vklyuchaye nove yadro dlya zamini GDI i GDI vikoristovuvani v Windows Forms WPF ye visokorivnevim ob yektno oriyentovanim funkcionalnim sharom angl framework sho dozvolyaye stvoryuvati dvovimirni ta trivimirni interfejsi XAMLXAML skorochennya vid Extensible Application Markup Language rozshiryuvana mova rozmitki zastosunkiv ye movoyu rozmitki yaku vikoristovuyut dlya stvorennya ekzemplyariv ob yektiv NET Hocha mova XAML ce tehnologiya sho mozhe buti zastosovna do bagatoh riznih predmetnih oblastej yiyi golovne priznachennya konstruyuvannya interfejsiv koristuvachiv WPF Inakshe kazhuchi dokumenti XAML viznachayut roztashuvannya panelej knopok ta inshih elementiv keruvannya sho stanovlyat vikna v zastosunku WPF Malojmovirno sho vam dovedetsya pisati kod XAML vruchnu Zamist cogo vi vikoristovuyete instrument sho generuye neobhidnij kod XAML Isnuye kilka pidmnozhin XAML WPF XAML vklyuchaye elementi sho opisuyut vmist WPF z rozryadu vektornoyi grafiki elementiv keruvannya j dokumentiv U cej chas ce najvazhlivishe zastosuvannya XAML XPS XAML chastina WPF XAML sho viznachaye XML podannya vidformatovanih elektronnih dokumentiv Vona opublikovana yak okremij standart XML Paper Specification XPS Silverlight XAML pidmnozhina WPF XAML priznachena dlya Silverlight zastosunkiv Mozhna vidvidati sajt shob oznajomitisya z detalyami WF XAML vklyuchaye elementi sho opisuyut umist Windows Workflow Foundation WF Dodatkova informaciya pro WF dostupna na sajtiKlas ApplicationU procesi vikonannya kozhnij zastosunok WPF predstavleno ekzemplyarom klasu System Windows Application Cej klas vidslidkovuye vsi vidkriti vikna u vashomu zastosunku virishuye koli vash zastosunok povinen buti zupinenim i iniciyuye podiyi zastosunka yaki vi mozhete obroblyati dlya vikonannya inicializaciyi abo ochishennya U WPF zastosunok prohodit cherez prostij zhittyevij cikl Odrazu pislya zapusku vashogo zastosunka stvoryuyetsya ob yekt zastosunka U procesi jogo vikonannya vinikayut rizni podiyi zastosunka yaki vi mozhete vidslidkovuvati I nareshti koli ob yekt zastosunka zvilnyayetsya vash zastosunok zavershuyetsya Najprostishij sposib vikoristannya klasu Application polyagaye v jogo stvorenni vruchnu Nastupnij priklad demonstruye absolyutnij minimum tochku vhodu v zastosunok metod Main sho stvoryuye vikno z imenem Window1 i zapuskaye novij zastosunok using System using System Windows public class Startup STAThread static void Main Stvorennya zastosunku Application app new Application Stvorennya golovnogo vikna Window1 win new Window1 Zapusk zastosunku i vidobrazhennya golovnogo vikna arr Run win Zvichajno klas Application zalishaye vash zastosunok aktivnim do tih pir doki hocha b odne vikno zalishayetsya vidkritim Yaksho vam ne potribno take povodzhennya vi mozhete zminiti Application ShutdownMode Yaksho vi stvoryuyete ob yekt Application vruchnu vam neobhidno ustanoviti vlastivist ShutdownMode pered zapuskom Run Mozhlivi taki varianti OnLastWindowClose povodzhennya za zamovchuvannyam vash zastosunok vikonuyetsya doti doki isnuye hocha b odne vidkrite nim vikno Yaksho vi zakrivayete golovne vikno to vlastivist Application MainWindow use she posilayetsya na ob yekt sho predstavlyaye zakrite vikno OnMainWindowClose ce tradicijnij pidhid zastosunok zalishayetsya zhivim tilki doti poki vidkrito golovne vikno OnExplicitShutdown Zastosunok nikoli ne zavershuyetsya navit yaksho vsi vikna zakriti poki vi navmisno ne viklichete Application Shutdown Cej pidhid mozhe buti vipravdanij yaksho vash zastosunok ye interfejsom dlya zadachi sho vikonuyetsya dosit dovgo abo yaksho vi hochete vikoristovuvati skladishu logiku shob virishiti koli vash zastosunok povinen zakritisya i todi vi viklikayete metod Application Shutdown Nezalezhno vid togo yakij sposib zupinu vi vikoristovuyete vi zavzhdi mozhete viklikati metod Application Shutdown dlya negajnogo zavershennya roboti zastosunku Podiyi klasu Application Pochatkovo fajl App xaml cs ne mistit niyakogo kodu Hoch kod ne obov yazkovij vi mozhete dodati kod obrobki podij zastosunka Klas Application nadaye nevelikij nabir korisnih podij Nizhche pererahovani najvazhlivishi z nih Startup vidbuvayetsya pislya vikliku metodu Application Run i bezposeredno pered pokazom golovnogo vikna yaksho vi peredayete golovne vikno metodu Run Exit vidbuvayetsya koli zastosunok zupinyayetsya z bud yakoyi prichini bezposeredno pered povernennyam z metodu Run Vi ne mozhete v cej moment skasuvati zupin hocha kod vashogo metodu Main mozhe povtorno zapustiti zastosunok Vi mozhete vikoristovuvati podiyu Exit dlya ustanovki cilochiselnogo kodu vihodu sho povertayetsya metodom Run SessionEnding vidbuvayetsya pislya zavershennya seansu Windows napriklad koli koristuvach vihodit iz sistemi abo zupinyaye komp yuter Mozhna viznachiti sho same vidbulosya perevirivshi vlastivist SessionEndingCancelEventArgs ReasonSessionEnding Takozh mozhna skasuvati zupin nadavshi SessionEndingCancelEventArgs Cancel znachennya true Yaksho cogo ne robiti to WPF vikliche metod Application Shutdown pislya zavershennya obroblyuvacha podiyi Activated vidbuvayetsya koli aktivizuyetsya odne z vikon zastosunku Ce traplyayetsya koli vi peremikayetesya z inshoyi programi Windows na cej zastosunok Takozh vinikaye pri pershomu pokazi vikna Deactivated vidbuvayetsya pri deaktivizaciyi vikna zastosunka Vidbuvayetsya koli vi peremikayetesya na inshu programu Windows DispatcherUnhandledExcept vidbuvayetsya koli vinikaye neopracovanij vinyatok u bud yakomu misci vashogo zastosunka u golovnomu potoci zastosunka Reaguyuchi na cyu podiyu vi mozhete protokolyuvati kritichni pomilki mozhna nejtralizuvati vinyatok i prodovzhiti robotu zastosunka ustanovivshi vlastivist DispatcherUnhandledExceptionEventArgs Handled v true Vi povinni pochati cej krok tilki v tomu vipadku yaksho vpevneni sho vash zastosunok perebuvaye v korektnomu stani i jogo robota mozhe buti prodovzhena Vidminnist klasiv Window i WinForm ta yihnya vzayemodiya odin z odnimVikna window ye osnovnimi elementami v bud yakomu nastilnomu zastosunku nastilki osnovnimi sho v yihnyu chest navit bula nazvana operacijna sistema Windows I hocha v WPF ye model dlya stvorennya navigacijnih zastosunkiv sho rozpodilyayut zadachi po okremih storinkah vikna zalishayutsya perevazhnoyu tehnologiyeyu dlya stvorennya zastosunkiv Tim komu dovodilos ranishe programuvati iz zastosuvannyam naboru instrumentalnih zasobiv Windows Forms bilsha chastina proponovanogo materialu zdastsya znajomoyu tomu sho klas Window faktichno ye vilnishoyu modellyu klasu Form 4 bereznya 2010 u Wayback Machine Klas Window uspadkovanij vid klasu ContentControl Ce oznachaye sho vin mozhe mistiti tilki odnogo nashadka yakim zvichajno ye kontejner maketa na zrazok elementa keruvannya Grid i sho jogo tlo mozhna zafarbovuvati za dopomogoyu kisti shlyahom ustanovki vlastivosti Background Mozhna she takozh vikoristovuvati j vlastivosti BorderBrush i BorderThickness dlya dodavannya navkolo vikna granici ale cya granicya dodayetsya useredini vikonnoyi ramki tobto po krayu kliyentskoyi oblasti Vikonnu ramku mozhna vzagali vidalyati i vstanovlyuvati na vlasnij rozsud Shob vidobraziti vikno neobhidno stvoriti ekzemplyar klasu Window i viklikati metod Show abo ShowDialog Metod ShowDialog vidobrazhaye modalne vikno Modalni vikna ne dozvolyayut koristuvachevi oderzhuvati dostup do batkivskogo vikna blokuyuchi mozhlivist vikoristannya v nomu mishi j mozhlivist uvedennya v nomu yakih nebud danih do tih pir doki modalne vikno ne bude zakrito Takozh metod ShowDialog she j ne zdijsnyuye povernennya do tih pir doki modalne vikno ne bude zakrito tak sho vikonannya bud yakogo kodu sho znahodit pislya nogo na chas vidkladayetsya Ce odnak ne oznachaye sho v cej chas ne mozhe vikonuvatisya j niyakij inshij kod napriklad pri nayavnosti zapushenogo tajmera obroblyuvach jogo podij odnakovo bude pracyuvati Najbilshe chasto zastosovuvana v kodi shema viglyadaye tak vidobrazhennya modalnogo vikna ochikuvannya jogo zakrittya j nastupne vikonannya nad jogo danimi yakoyi nebud operaciyi Metod Show vidobrazhaye nemodalne vikno sho ne blokuye dostup koristuvacha ni do yakih inshih vikon Bilshe togo metod Show zdijsnyuye povernennya vidrazu zh pislya vidobrazhennya vikna tak sho nastupni pislya nogo v kodi operatori vikonuyutsya negajno Mozhna stvoryuvati j pokazuvati vidrazu kilka nemodalnih vikon i koristuvach mozhe vzayemodiyati z usima nimi odnochasno U vipadku zastosuvannya nemodalnih vikon inodi potriben kod sinhronizaciyi sho garantuye vidnovlennya informaciyi v drugomu vikni pri vnesenni yakihos zmini v pershomu j tim samim viklyuchati imovirnist roboti koristuvacha z nedijsnimi danimi Volodinnya viknami NET dozvolyaye viknu voloditi inshimi viknami Vikna sho mayut vikno vlasnika zruchno zastosovuvati dlya plavayuchih vikon panelej instrumentiv i vikon komand Odnim iz prikladiv takogo vikna ye vikno Find and Replace Znajti j zaminiti v Microsoft Word Koli vikno vlasnik zgortayetsya vikno yakim vono volodiye tezh avtomatichno zgortayetsya Koli vikno sho maye vlasnika perekrivaye vikno yake nim volodiye vono zavzhdi vidobrazhayetsya zverhu Dlya pidtrimki volodinnya vikna klas Window proponuye dvi vlastivosti vlastivist Owner i vlastivist OwnedWindows Vlastivist Owner yavlyaye soboyu posilannya sho vkazuye na vikno sho volodiye potochnim viknom yaksho take ye a vlastivist OwnedWindows kolekciyu vsih vikon yakimi volodiye potochne vikno znovu zh yaksho taki ye Nepryamokutni vikna Vikna nezvichajnoyi formi chasto ye tovarnim znakom ultrasuchasnih populyarnih zastosunkiv bagatoh redaktoriv fotografij program dlya stvorennya kinofilmiv i mp3 progravachiv U stvorenni bazovogo zastosunku nestandartnoyi formi v WPF nemaye nichogo skladnogo Odnak stvorennya privablivogo vikna nezvichajnoyi formi vimagaye chimalih zusil i neridko zaluchennya talanovitogo dizajnera grafiki dlya stvorennya nacherkiv i fonovoyi grafiki Bazova procedura dlya stvorennya vikna nestandartnoyi formi maye na uvazi vikonannya nastupnih krokiv Vstanovit dlya vlastivosti Window AllowsTransparency znachennya true Vstanovit dlya vlastivosti Window WindowStyle znachennya None shob shovati ne kliyentsku oblast vikna ryadok zagolovku Yaksho cogo ne zrobiti pri sprobi pokazati vikno z yavitsya pomilka InvalidOperationException Vstanovit dlya tla vlastivist Background prozorij kolir kolir Transparent znachennya alfa kanalu yakogo dorivnyuye nulyu Abo zh zrobit tak shob dlya tla vikoristovuvalosya zobrazhennya sho maye prozori oblasti z nulovim znachennyam alfa kanal Ci tri kroki efektivno vidalyayut standartnij zovnishnij viglyad vikna yakij fahivci z WPF chasto nazivayut hromom chrome vikna Dlya zabezpechennya efektu vikna nezvichajnoyi formi dali neobhidno nadati yakijs neprozorij umist sho maye potribnu formu Tut mozhlivi pererahovani nizhche varianti Nadati fonovu grafiku vikoristovuyuchi fajl takogo formatu sho pidtrimuye prozorist Napriklad dlya tla mozhna vikoristovuvati fajl PNG Ce prostij pryamolinijnij pidhid i vin duzhe zruchnij yaksho dovoditsya pracyuvati z dizajnerami yaki ne rozbirayutsya v XAML Odnak cherez te sho vikno bude vizualizuvatisya z bilshoyu kilkistyu pikseliv i bilsh visokimi sistemnimi parametrami DPI fonova grafika mozhe otrimati perekruchenij viglyad Ce takozh mozhe predstavlyati problemu j u vipadku dozvolu koristuvachevi zminyuvati rozmiri vikna Vikoristovuvati dostupni v WPF funkciyi dlya malyuvannya formi shob stvoriti tlo z vektornim umistom Takij pidhid viklyuchaye vtratu yakosti yakimi b ne buli rozmiri vikna j DPI parametri sistemi Odnak u comu vipadku napevno bude potribno vikoristovuvati zasib proektuvannya sho pidtrimuye XAML Vikoristovuvati bilshe prostij WPF element sho maye neobhidnu formu Napriklad vikno iz chudovimi okruglenimi krayami mozhna stvoriti za dopomogoyu elementa Border Takij pidhid dozvolyaye stvoryuvati vikna iz suchasnim zovnishnim viglyadom u stili Office bez zastosuvannya yakih nebud dizajnerskih navichok Vzayemodiya z WinForms V idealnomu sviti yak tilki rozroblyuvach osvoyiv bi novu tehnologiyu podibnu WPF vin mig bi zalishiti kolishnyu v minulomu Vse povinne bulo b rozroblyatisya tilki na osnovi novogo najbagatshogo instrumentariyu ne potribno bulo b turbuvatisya pro uspadkovanij kod Zvichajno cej idealnij svit ne maye nichogo spilnogo zi svitom realnim u comu ye dvi prichini yaki zmushuyut rozroblyuvachiv WPF u pevnij moment vzayemodiyati iz platformoyu Windows Forms shob zberegti investiciyi v rozrobku isnuyuchogo kodu j shob kompensuvati mozhlivosti yakih brakuye v WPF Najprostishij sposib integraciyi vmistu WPF i Windows Forms polyagaye v roztashuvanni yih v okremih viknah Takim chinom vash zastosunok bude skladatisya z dobre inkapsulovanih klasiv vikon kozhnij z yakih maye spravu tilki z odniyeyu tehnologiyeyu Bud yaki podrobici vzayemodiyi obroblyayutsya v kodi kleyu logici sho stvoryuye j vidobrazhaye vikna Dodavannya form do zastosunka WPF Najprostishij pidhid do zmishuvannya vikon i form polyagaye v dodavanni odniyeyi abo bilshe form z naboru instrumentiv Windows Forms do zvichajnogo zastosunku WPF U Visual Studio ce vidbuvayetsya standartno klacannya pravoyu knopkoyu mishi na imeni proektu v Solution Explorer i vibir u kontekstnomu menyu komandu Add New Item Pri pershomu dodavanni formi Visual Studio dodast posilannya na vsi neobhidni zbirki Windows Forms vklyuchayuchi System Windows Forms dll i System Drawing dll Vi mozhete sproektuvati formu v proekti WPF tochno tak samo yak robite ce v proekti Windows Forms Koli vi vidkrivayete formu Visual Studio zavantazhuye zvichajnij vizualnij konstruktor form Windows Forms i napovnyuye panel instrumentiv elementami keruvannya Windows Forms Koli vi vidkrivayete fajl XAML dlya vikna WPF to oderzhuyete seredovishe konstruktora WPF Dodavannya vikon WPF u zastosunok Windows Forms Zvorotnij hid trohi skladnishe Visual Studio ne dozvolyaye pryamo stvoriti nove vikno WPF u zastosunku Windows Forms inakshe kazhuchi vi ne pobachite jogo yak odin z dostupnih shabloniv pri klacanni pravoyu knopkoyu mishi na imeni proektu i vibori v kontekstnomu menyu komandi Add New Item Odnak vi mozhete dodati isnuyuchi fajli cs i xaml yaki viznachayut vikno WPF z inshogo proektu Shob zrobiti ce klacnit pravoyu knopkoyu mishi na im ya proektu v Solution Explorer viberit u kontekstnomu menyu komandu Add Existing Item i znajdit ci fajli Vam takozh znadobitsya dodati posilannya na osnovni zbirki WPF PresentationCore dll PresentationFramework dll i WindowsBase dll Yaksho dodati vikno WPF do zastosunka Windows Forms vse bude pravilno Koli vi vidkriyete jogo to zmozhete vikoristovuvati dizajner WPF dlya jogo modifikaciyi Pri pobudovi proektu bude skompilovanij XAML i avtomatichno zgenerovanij kod bude ob yednanij z vashim klasom kodu yak nibi ce bulo povnocinnim WPF zastosunkom Stvorennya proektu sho vikoristovuye formi j vikna ye neskladnim Odnak ye kilka dodatkovih nyuansiv yaki varto vrahovuvati koli vi vidobrazhayete ci formi j vikna pid chas vikonannya Yaksho vam potribno pokazati vikno abo formu modalno yak ce robitsya z dialogovimi viknami to taka zadacha dosit prosta j ne vimagaye zmini kodu Ale yaksho vi hochete pokazuvati vikna v nemodalnomu rezhimi to vam znadobitsya rozrobiti dodatkovij kod shob zabezpechiti korektnu pidtrimku klaviaturi sho bude opisano dali Vidobrazhennya modalnih vikon i form Vidobrazhennya modalnoyi formi v zastosunku WPF ne vimagaye zusil Vi vikoristovuyete v tochnosti toj zhe kod sho j u proekti Windows Forms Napriklad yaksho u vas ye klas formi z imenem Form1 te dlya jogo modalnogo vidobrazhennya vi zastosovuyete takij kod Forml frm new Form1 if frm ShowDialog System Windows Forms DialogResult OK MessageBox Show Vi natisnuli na OK u formi Windows Forms Zauvazhte sho metod Form ShowDialog pracyuye desho inakshe nizh WPF metod Window ShowDialog U toj chas yak Window ShowDialog povertaye true false abo null metod Form ShowDialog povertaye znachennya z pererahuvannya DialogResult Zvorotna zadacha vidobrazhennya vikna WPF z formi nastilki zh prosta Vi prosto vzayemodiyete iz zagalnodostupnim interfejsom vashogo klasu vikna a WPF podbaye pro inshe Windowl win new Windowl if win ShowDialog true MessageBox Show Vi natisnuli na OK u vikni WPF Vidobrazhennya nemodalnih vikon i form Yaksho vi hochete vidobrazhati vikna abo formi v nemodalnomu rezhimi to tut vse ne tak prosto Skladnist polyagaye v tomu sho klaviaturne uvedennya prijmayetsya korenevim zastosunkom i povinen buti dostavlene u vidpovidne vikno Shob ce pracyuvalo mizh umistom WPF i Windows Forms potriben yakijs sposib peredachi cih povidomlen potribnomu viknu abo formi Yaksho vi hochete pokazuvati vikno WPF u nemodalnomu rezhimi zseredini zastosunka Windows Forms to povinni dlya cogo vikoristovuvati statichnij metod ElementHost EnableModelessKeyboardlnterop Vam takozh znadobitsya posilannya na zbirku WmdowsFormsIntegration dll sho viznachaye klas ElementHost u prostori imen System Windows Formslntegration Metod EnableModelessKeyboardlnterop viklikayetsya pislya stvorennya vikna ale pered jogo vidobrazhennyam Viklikayuchi cej metod peredajte jomu posilannya na nove vikno WPF yak pokazano nizhche Window1 win new Window1 ElementHost EnableModelessKeyboardInterop win win Show Pri vikliku EnableModelessKeyboardlnterop ob yekt ElementHost dodaye filtr povidomlen u zastosunok Windows Forms Cej filtr povidomlen perehoplyuye klaviaturni povidomlennya koli aktivne vashe vikno WPF i peresilaye yih jomu Bez cogo vashi elementi keruvannya WPF prosto ne oderzhat klaviaturnogo uvedennya Yaksho potribno vidobraziti nemodalnij zastosunok Windows Forms useredini zastosunka WPF vikoristovujte analogichnij metod WindowsFormsHost EnableWindowsFormsInterop Odnak u comu vipadku ne potribno peredavati posilannya na formu sho vi hochete pokazati Zamist cogo vi prosto viklikayete cej metod odin raz pered vidobrazhennyam bud yakoyi formi garnim rishennyam bude viklikati jogo pri zapusku zastosunka Teper vi mozhete prosto pokazati formu v nemodalnomu rezhimi bez usyakih dodatkovih zusil WindowsFormsHost EnableWindowsFormsInterop Forml frm new Forml frm Show Bez vikliku EnableWindowsFormsInterop vasha forma bude vidobrazhatisya ale ne rozpiznaye niyakogo klaviaturnogo uvedennya Napriklad vi ne zmozhete vikoristovuvati klavishu lt Tab gt dlya perehodu vid odnogo elementa keruvannya do inshogo Cej proces mozhna rozshiriti na kilka rivniv Napriklad vi mozhete stvoriti vikno WPF sho vidobrazhatime formu modalno abo ne modalno a cya forma u svoyu chergu mozhe pokazati vikno WPF Hocha ce ne dovedetsya robiti duzhe chasto vse taki ce krashij pidhid anizh pidtrimka vzayemodiyi mizh riznoridnimi elementami Taka pidtrimka dozvolyaye integruvati rizni tipi vmistu v odnomu vikni ale ne dozvolyaye vkladati na bilsh nizh odin riven uglib napriklad stvoriti vikno WPF sho mistit element keruvannya Windows Forms sho u svoyu chergu mistit u sobi element keruvannya WPF Komponuvannya ta elementi upravlinnya WPFPonyattya komponuvannya v WPF Vikno WPF mozhe mistiti tilki odin element Shob rozmistiti bilshe odnogo elementa j stvoriti bilshe praktichnij koristuvalnickij interfejs vam potribno pomistiti u vikno specialnij element keruvannya kontejner i potim dodavati elementi v cej kontejner V WPF komponuvannya viznachayetsya vikoristovuvanim kontejnerom Hocha ye kilka kontejneriv sered yakih mozhna vibirati bud yakij idealne vikno WPF maye piddavatis opisanim nizhche klyuchovim principam Elementi taki yak elementi keruvannya ne povinni mati yavno vstanovlenih rozmiriv Zamist cogo voni rostut shob zapovniti yihnij umist Napriklad knopka zbilshuyetsya koli vi dodayete v neyi tekst Vi mozhete obmezhiti elementi keruvannya prijnyatnimi rozmirami ustanovlyuyuchi maksimalne j minimalne yihni znachennya Elementi ne vkazuyut svoyu poziciyu v ekrannih koordinatah Zamist cogo voni vporyadkovuyutsya svoyim kontejnerom na osnovi rozmiru poryadku j neobov yazkovo inshoyi informaciyi specifichnoyi dlya kontejnera komponuvannya Yaksho vi hochete dodati probil mizh elementami to vikoristovuyete dlya cogo vlastivist Margin Kontejneri komponuvannya rozdilyayut dostupnij prostir mizh svoyimi dochirnimi elementami Voni namagayutsya nadati kozhnomu elementu jogo najkrashij rozmir na osnovi jogo vmistu yaksho dozvolyaye vilnij prostir Voni mozhut takozh vidilyati dodatkovij prostir dochirnim elementam Kontejneri komponuvannya mozhut buti vkladenimi Tipovij koristuvalnickij interfejs pochinayetsya z Grid najrozvinenishogo kontejnera i mistit inshi kontejneri komponuvannya yaki organizovuyut menshi grupi elementiv taki yak tekstovi polya z mitkami elementi spisku piktogrami v paneli instrumentiv i t d Komponuvannya WPF vidbuvayetsya za dvi stadiyi stadiya vimiru j stadiya rozmishennya Na stadiyi vimiru kontejner vikonuye prohid u cikli dochirnimi elementami j opituye yihni najkrashi rozmiri Na stadiyi rozmishennya kontejner pomishaye dochirni elementi u vidpovidni poziciyi Vsi kontejneri komponuvannya WPF ye panelyami yaki uspadkovani vid abstraktnogo klasu System Windows Controls Panel Faktichno bazovij klas Panel ce ne sho inshe yak pochatkova tochka dlya pobudovi inshih bilsh specializovanih klasiv WPF proponuye ryad pohidnih vid Panel klasiv yaki vi mozhete vikoristovuvati dlya organizaciyi komponuvannya Yak i vsi elementi keruvannya WPF i bilshist vizualnih elementiv ci klasi perebuvayut u prostori imen System Windows Controls Osnovni paneli komponuvannya StackPanel Rozmishaye elementi v gorizontalnij abo vertikalnij stek Cej kontejner komponuvannya zvichajno vikoristovuyetsya v nevelikih sekciyah velikogo bilshe skladnogo vikna WrapPanel Rozmishaye elementi v seriyah ryadkiv z perenosom U gorizontalnij oriyentaciyi Wrap Panel roztashovuye element u ryadku livoruch pravoruch potim perehodit do nastupnogo ryadka U vertikalnij oriyentaciyi WrapPanel roztashovuye element zverhu dolilic vikoristovuyuchi dodatkovi stovpchiki dlya dopovnennya elementiv sho zalishilisya DockPanel Virivnyuye elementi po krayu kontejnera Grid Vishikovuye elementi v ryadki j stovpchiki nevidimoyi tablici Ce odin z najbilsh gnuchkih i shiroko vikoristovuvanih kontejneriv komponuvannya UniformGrid Roztashovuye elementi v nevidimu tablicyu ustanovlyuyuchi odnakovij rozmir dlya vsih oseredkiv Cej kontejner komponuvannya vikoristovuyetsya nechasto Canvas Dozvolyaye elementam pozicionuvatisya absolyutno za fiksovanimi koordinatami Cej kontejner komponuvannya najbilshe shozhij na tradicijnij komponovshik Windows Forms ale ne peredbachaye zasobiv priv yazki j stikuvannya U rezultati ce nevidpovidnij vibir dlya vikon zminnogo rozmiru yakij prizvodit do znachnogo obsyagu roboti Vlastivosti komponuvannya HorizontalAlignment Viznachaye pozicionuvannya dochirnogo elementa useredini kontejnera komponuvannya koli dostupno dodatkovij prostir po gorizontali Vi mozhete vibrati Center Left Right abo Stretch VerticalAlignment Viznachaye pozicionuvannya dochirnogo elementa useredini kontejnera komponuvannya koli dostupno dodatkovij prostir po vertikali Vi mozhete vibrati Center Top Bottom abo Stretch Margin Dodaye nebagato miscya navkolo elementa Vlastivist Margin ce ekzemplyar strukturi System Windows Thickness z okremimi komponentami dlya verhnoyi nizhnoyi livoyi j pravoyi granej MinWidth i MinHeight Ustanovlyuye minimalni rozmiri elementa Yaksho element zanadto velikij shob pomistitisya v jogo kontejner komponuvannya vin bude usichenij MaxWidth i MaxHeight Ustanovlyuye maksimalni rozmiri elementa Yaksho kontejner maye vilnij prostir element ne bude zbilshenij ponad zaznacheni mezhi navit yaksho vlastivosti HorizontalAlignment i VerticalAlignment ustanovleni v Stretch Width i Height Yavno vstanovlyuyut rozmiri elementa Cya ustanovka pereviznachaye znachennya Stretch dlya vlastivostej HorizontalAlignment i VerticalAlignment Odnak cej rozmir ne bude vstanovlenij yaksho vihodit za mezhi zadani v MinWidth MinHeight MaxWidth i MaxHeight Inshi elementi upravlinnya ScrollViewer V WPF pidtrimku prokruchuvannya zabezpechiti neskladno odnak dlya cogo bude potribno specialnij ingrediyent element keruvannya vmistom ScrollViewer Shob zabezpechiti pidtrimku prokruchuvannya vam potribno vpakuvati vmist sho vi hochete prokruchivati v ScrollViewer Popri te sho cej element keruvannya mozhe zberigati sho zavgodno zvichajno vin vikoristovuyetsya dlya vpakuvannya kontejnera komponuvannya GroupBox i Tabltem elementi keruvannya vmistom sho mayut zagolovki U klasu ContentControl ye tri spadkoyemci GroupBox Tabltem i Expander Element keruvannya GroupBox ye najprostishim z nih Vin vidobrazhayetsya u viglyadi vikna z okruglenimi kutami j zagolovkom Tabltem predstavlyaye storinku v elementi keruvannya TabControl Klas Tabltem dodaye odna vazhliva vlastivist IsSelected sho pokazuye chi vidobrazhayetsya v cej moment vkladka v elementi keruvannya TabControl Najekzotichnishim elementom keruvannya vmistom ye Expander Vin upakovuye oblast umistu yaku koristuvach mozhe pokazuvati abo prihovuvati klacayuchi na nevelikij knopci zi strilkoyu Cya tehnologiya vikoristovuyetsya chasto v operativnih dovidkovih sistemah a takozh na Web Storinkah shob voni mogli vklyuchati bilshi obsyagi vmistu ne perevantazhuyuchi koristuvachiv informaciyeyu yaku yim ne hochetsya bachiti Najprostishim elementom keruvannya vmistom ye Label mitka Yak i bud yakij inshij element keruvannya vmistom vona prijmaye odinochnu porciyu vmistu sho vi hochete pomistiti useredini yiyi Vidmitnoyu risoyu elementa Label ye jogo pidtrimka mnemonichnih komand klavish shvidkogo dostupu yaki peredayut fokus zv yazanomu elementu keruvannya WPF rozpiznaye tri tipi knopok Button CheckBox i RadioButton Vsi ci knopki yavlyayut soboyu elementi keruvannya vmistom sho ye spadkoyemcyami klasu ButtonBase WPF vklyuchaye tri tekstovih elementi keruvannya TextBox RichTextBox i PasswordBox Element PasswordBox ye pryamim spadkoyemcem klasu Control Elementi keruvannya TextBox i RichTextBox ye spadkoyemcyami klasu TextBase WPF vklyuchaye bagato elementiv keruvannya yaki mozhut pracyuvati z kolekciyeyu elementiv pochinayuchi iz prostih elementiv keruvannya ListBox i ComboBox i zakinchuyuchi bilshe specializovanimi elementami keruvannya takimi yak ListView TreeView i ToolBar Vsi ci elementi keruvannya ye nashadkami klasu ItemsControl vin u svoyu chergu ye nashadkom klasu Control Element keruvannya Slider ye bilshe specializovanim elementom keruvannya sho chasom viyavlyayetsya korisnim Napriklad nim mozhna skoristatisya dlya zavdannya chislovih znachen u tih situaciyah koli same chislo ne ye osoblivo vazhlivim Napriklad guchnist u progravachi najkrashe vstanovlyuvati peremishayuchi v rizni storoni bigunok na linijci prokruchuvannya Zagalna poziciya bigunka pokazuye vidnosnu guchnist normalno tiho golosno a lezhache v jogo osnovi chislo ne predstavlyaye osoblivogo zmistu dlya koristuvacha Element keruvannya ProgressBar pokazuye hid vikonannya trivaloyi zadachi Na vidminu vid povzunka ProgressBar ne ye interaktivnim elementom keruvannya Navpaki za zminu znachennya vlastivosti Value vidpovidaye vinyatkovo vash kod pravila WPF viznachayut sho ProgressBar ne povinen buti elementom keruvannya oskilki vin ne reaguye na diyi mishi abo uvedennya na klaviaturi Dekoratori Mova jde pro dekoratori yaki zvichajno sluzhat dlya togo shob grafichno uriznomanititi j prikrasiti oblast navkolo ob yekta Vsi dekoratori ye spadkoyemcyami klasu System WindowsControls Decorator Bilshist dekoratoriv priznachena dlya vikoristannya razom z pevnimi elementami keruvannya Klas Border duzhe prostij Vin prijmaye okremu porciyu vkladenogo vmistu yakim chasto ye panel komponuvannya i dodaye do nogo tlo abo ramku Viewbox bilsh ekzotichnij dekorator Princip zakladenij v osnovu Viewbox zrozumiti neskladno Bud yakij umist sho vi pomishayete v dekorator Viewbox masshtabuyetsya takim chinom shob vin mig umistitisya v comu dekoratori Koristuvacki elementiKoristuvalnickij element ne najkrashij vibir koli vi hochete prosto pidpraviti zovnishnij viglyad elementa ale cilkom vipravdanij koli potribno istotno zminiti jogo funkcionalnist Napriklad ye prichini isnuvannya v WPF okremih klasiv TextBox i PasswordBox tomu sho voni obroblyayut natiskannya klavish po riznomu zberigayuchi dani useredini sebe riznimi sposobami po riznomu vzayemodiyuchi z inshimi komponentami takimi yak bufer obminu j t p Analogichno yaksho vi hochete sproektuvati element keruvannya sho maye svij vlasnij vinyatkovij nabir vlastivostej metodiv i podij to vam dovedetsya stvoryuvati jogo samostijno FrameworkElement najnizhchij riven z yakim vi zvichajno budete mati spravu pri stvorenni koristuvalnickogo elementa Zvichajno takij pidhid vibirayetsya tilki todi koli potribno namalyuvati jogo vmist z nulya za dopomogoyu pereviznachennya OnRender i vikoristannya System Windows Media DrawingContext Ce shozhe na pidhid de koristuvalnickij interfejs konstruyuvavsya na osnovi ob yektiv Visual Klas FrameworkElement nadaye lish bazovij nabir vlastivostej i podij dlya elementiv yaki ne priznacheni dlya vzayemodiyi z koristuvachem Control Cej klas najchastishe sluzhit pochatkovoyu tochkoyu pri pobudovi elementa keruvannya z nulya Ce bazovij klas dlya vsih vzayemodiyuchih z koristuvachem grafichnih elementiv keruvannya Klas Control dodaye vlastivosti dlya ustanovki tla j perednogo planu a takozh shriftu j virivnyuvannya vmistu Krim togo cej klas pomishaye sebe v poslidovnist tabulyaciyi vlastivistyu isTabStop i oderzhuye povidomlennya pro podvijne klacannya cherez podiyi MouseDoubleCiick i Preview MouseDoubleClick Ale bilshe vazhlivo te sho klas Control viznachaye vlastivist Template sho dozvolyaye zaminyati jogo zovnishnij viglyad z neobmezhenoyu gnuchkistyu ContentControl Ce bazovij klas dlya elementiv keruvannya yaki mozhut vidobrazhatisya yak yedine cile z dovilnim umistom Umist mozhe buti elementom koristuvalnickogo ob yekta zastosovuvanogo v spoluchenni iz shablonom Bagato elementiv keruvannya vpakovuyut specifichnij obmezhenij tip umistu Oskilki ci elementi keruvannya ne pidtrimuyut vsih elementiv voni ne povinni viznachatisya yak elementi keruvannya iz umistom UserControl Ce element keruvannya iz umistom sho mozhe buti skonfigurovanim iz zastosuvannyam poverhni chasu proektuvannya Hocha takij koristuvalnickij element keruvannya ne nastilki vidriznyayetsya vid zvichajnogo elementa keruvannya iz umistom zvichajno vin vikoristovuyetsya todi koli vi hochete shvidko povtorno zastosuvati nezminnij blok koristuvacogo interfejsu v bilsh nizh odnomu vikni zamist stvorennya dijsno okremogo elementa keruvannya sho mozhe buti perenesenij z odnogo zastosunka v inshij ItemsControl Selector bazovij klas dlya elementiv keruvannya sluzhbovciv obolonkami dlya spiskiv elementiv ale ne pidtrimuyuchij vibir pozicij u toj chas yak Selector bilshe specializovanij bazovij klas dlya elementiv sho pidtrimuyut vibir Ci klasi nechasto zastosovuyutsya dlya stvorennya koristuvalnickih elementiv keruvannya oskilki zasobu shabloniv danih ListBox ListView i TreeView zabezpechuyut dostatnyu gnuchkist Panel Bazovij klas dlya elementiv keruvannya sho volodiye logikoyu komponuvannya Element iz komponuvannyam mozhe mistiti v sobi bezlich dochirnih elementiv i rozmishati yih vidpovidno do pevnoyi semantiki komponuvannya Chasto paneli vklyuchayut prikripleni vlastivosti yaki mozhut buti vstanovleni v dochirni elementi dlya togo shob konfiguruvati yihnye roztashuvannya Decorator Specifichnij klas elementa keruvannya Ce bazovij klas dlya elementiv sho sluzhat obolonkami dlya inshih elementiv i zabezpechuyut grafichnij efekt abo pevnij zasib Dvoma yaskravimi prikladami mozhut sluzhiti Border sho malyuye liniyu navkolo elementa i viewbox sho masshtabuye svij umist dinamichno z vikoristannyam transformacij Sered inshih dekoracij klas Chrome vikoristovuvanij dlya postachannya znajomimi ramkami j tlom chasto vikoristovuvanih elementiv keruvannya takih yak knopka Ponyattya komand WPF podiyi sho marshrutizuyutsyaZagalni vidomosti pro komandi U dobre sproektovanomu zastosunku Windows logika zastosunka perebuvaye ne v obroblyuvachah podij a zakodovana v metodah sho bilshe mayut visokij riven Kozhnij iz cih metodiv predstavlyaye odnu zadachu task rozv yazuvanu zastosunkom Kozhna zadacha mozhe pokladatisya na dodatkovi biblioteki okremo skompilovani komponenti u yakih inkapsulyuyetsya biznes logika abo dostup do bazi danih Priklad takih vidnosin pokazanij na eskizi Najochevidnishim sposobom vikoristannya takogo dizajnu ye dodavannya obroblyuvachiv podij skriz de voni potribni i zastosuvannya kozhnogo z nih dlya vikliku vidpovidnogo metodu zastosunka Faktichno u takomu razi kod vikna peretvoryuyetsya v polegshenu komutacijnu panel sho reaguye na uvedennya j peresilaye zapiti useredinu zastosunka Hocha takij dizajn ye cilkom rozumnim vin ne zaoshadzhuye niyakih zusil Bagato zadach zastosunka mozhut iniciyuvatisya na riznih marshrutah cherez sho vse zh taki dovoditsya chasto pisati deklka obroblyuvachiv podij sho viklikayut toj samij metod zastosunka V comu nemaye osoblivoyi problemi tomu sho kod komutacijnoyi paneli dosit prostij ale zhittya nabagato uskladnyuyetsya koli dovoditsya mati spravu zi stanom koristuvalnickogo interfejsu Zrozumiti pro sho jde mova dopomozhe prostij priklad Pripustimo sho ye programa do skladu yakoyi vhodit metod z imenem PrintDocument Cej metod mozhe iniciyuvatisya chotirma sposobami cherez golovne menyu shlyahom viboru v menyu File Fajl komandi Print Druk cherez kontekstne menyu shlyahom vikonannya klacannya pravoyu knopkoyu mishi v porozhnij oblasti j viboru v kontekstnomu menyu sho z yavivsya komandi Print Druk za dopomogoyu klaviaturnoyi kombinaciyi lt Ctrl P gt i za dopomogoyu vidpovidnoyi knopki v paneli instrumentiv U pevnih momentah zhittyevogo ciklu zastosunku zadacha PrintDocument povinna buti nedostupnoyi Ce maye na uvazi vidklyuchennya vidpovidnih komand u dvoh menyu j knopki v paneli instrumentiv takim chinom shob na nih ne mozhna bulo vikonuvati klacannya a takozh ignoruvannya klaviaturnoyi kombinaciyi lt Ctrl P gt Napisannya kodu sho robit ce i dodavannya kodu sho vklyuchaye dani elementi keruvannya piznishe duzhe neprostij pidhid Navit she girshe te sho dopushennya v nomu pomilki mozhe prizvesti do togo sho rizni bloki kodu stanu budut perekrivatisya nepravilno zalishayuchi element keruvannya v aktivnomu stani navit todi koli vin ne povinen buti dostupnij Napisannya j nalagodzhennya podibnogo kodu ye odnim z najmensh priyemnih aspektiv rozrobki Windows zastosunkiv Na divo bagatoh dosvidchenih rozroblyuvachiv Windows zastosunkiv u nabori instrumentalnih zasobiv Windows Forms ne bulo niyakih funkcionalnih mozhlivostej yaki mogli b polegshuvati vikonannya podibnih operacij Rozroblyuvachi mogli stvoryuvati neobhidnu yim infrastrukturu samostijno ale bilshist iz nih volilo cogo ne robiti Na shastya WPF zapovnyuye cej probil proponuyuchi novu komandnu model sho nadaye dvi nastupnih vazhlivih mozhlivosti deleguvannya podij vidpovidnimi komandam pidtrimka vklyuchenogo stanu elementa keruvannya v sinhronizovanomu vidi za dopomogoyu stanu vidpovidnoyi komandi Model komand WPF skladayetsya z velikoyi kilkosti ruhlivih chastin Klyuchovimi v nij ye chotiri taki komponenti Komandi Komanda predstavlyaye zadachu zastosunka j stezhit za tim koli vona mozhe buti vikonana Odnak kodu yakij vikonuye zadachu zastosunka komandi naspravdi ne mistyat Priv yazki komand Kozhna priv yazka binding maye na uvazi z yednannya komandi z logikoyu sho maye do neyi vidnoshennya zastosunka vidpovidalnoyi za obslugovuvannya pevnoyi oblasti koristuvalnickogo interfejsu Takij faktorizovanij dizajn duzhe vazhlivij tomu sho ta sama komanda mozhe vikoristovuvatisya v dekilkoh miscyah u zastosunku j mati v kozhnomu z nih rizne priznachennya Dlya zabezpechennya podibnogo povodzhennya same j sluzhat rizni priv yazki odniyeyi j toyi zh komandi Dzherela komand Dzherelo komandi iniciyuye komandu Napriklad i element keruvannya Menultem i element keruvannya Button mozhut sluzhiti dzherelami komand Klacannya na nih u takomu vipadku bude privoditi do vikonannya priv yazanoyi komandi Cilovi ob yekti komand Cilovij ob yekt komandi ce element dlya yakogo priznachena dana komanda tobto element na yakomu vona vikonuyetsya Napriklad komanda Paste mozhe vstavlyati tekst v element TextBox a komanda OpenFile vidobrazhati dokument v elementi DocumentViewer Cilovij ob yekt mozhe buti vazhlivij a mozhe buti j nevazhlivij sho zalezhit vid prirodi komandi Interfejs ICommand Sercem modeli komand WPF bezumovno ye interfejs System Windows Input ICommand sho viznachaye sposib u vidpovidnist iz yakim pracyuyut komandi Cej interfejs vklyuchaye dva metodi j podiya public interface ICommand void Execute object parameter bool CanExecute object parameter event EventHandler CanExecuteChanged Pri stvorenni svoyih vlasnih komand realizovuvati interfejs ICommand pryamo ne obov yazkovo Zamist cogo mozhna vikoristovuvati klas System Windows Input RoutedCommand sho realizuye cej interfejs avtomatichno Klas RoutedCommand ye yedinim klasom u WPF sho realizuye interfejs ICommand Inakshe kazhuchi vsi komandi WPF yavlyayut soboyu ekzemplyari klasu RoutedCommand abo pohidnogo vid nogo klasu Odna iz klyuchovih koncepcij sho lezhat v osnovi modeli komand u WPF polyagaye v tomu sho klas RoutedCommand ne mistit niyakoyi logiki zastosunka Vin prosto predstavlyaye komandu Ce oznachaye sho odin ob yekt RoutedCommand maye ti zh mozhlivosti sho j inshij Yaksho interfejs ICommand inkapsulyuye ideyu komandi diyi sho mozhe iniciyuvatisya j buti abo ne buti dostupnoyu to klas RoutedCommand zminyuye komandu tak shob vona mogla podibno bulbashci pidnimatisya nagoru iyerarhiyeyu elementiv WPF do vidpovidnogo obroblyuvacha podij Bilshist komand z yakimi rozrobniku dovedetsya mati spravu budut ne ob yektami RoutedCommand a ekzemplyarami klasu RoutedUICommand yakij uspadkovuyetsya vid klasu RoutedCommand Naspravdi vsi zagotovleni komandi yaki nadaye WPF ye same ob yektami RoutedUICommand Biblioteka komand Rozroblyuvachi WPF urahuvali toj fakt sho v kozhnomu zastosunku mozhe vikoristovuvatisya velichezna kilkist komand i sho bagato komand mozhut buti zagalnimi dlya mnozhini zastosunkiv Napriklad u vsih zastosunkah priznachenih dlya obrobki dokumentiv budut prisutni svoyi vlasni versiyi komand New Stvoriti Open Vidkriti i Save Zberegti Tomu dlya zmenshennya obsyagu zusil neobhidnih dlya stvorennya takih komand voni vklyuchili do skladu WPF biblioteku bazovih komand u yakij utrimuyetsya ponad 100 komand Vsi ci komandi dostupni cherez statichni vlastivosti p yati vidpovidnih statichnih klasiv ApplicationCommands Cej klas nadaye zagalni komandi vklyuchayuchi komandi pov yazani z buferom obminu taki yak Kopiyuvati Virizati i Vstaviti i komandi sho stosuyutsya obrobki dokumentiv New Stvoriti Open Vidkriti Save Zberegti SaveAs Zberegti yak Print Druk i t d NavigationCommands Cej klas nadaye komandi vikoristovuvani dlya navigaciyi vklyuchayuchi ti sho priznacheno dlya storinkovih zastosunkiv na zrazok komandi BrowseBack Nazad BrowseForward Upered i NextPage Perehid i ti sho pidhodyat dlya zastosunkiv priznachenih dlya roboti z dokumentami komandi IncreaseZoom Masshtab i Refresh Obnoviti EditingCommands Cej klas nadaye dovgij perelik komand priznachenih u bilshij miri dlya redaguvannya dokumentiv vklyuchayuchi komandi dlya peremishennya MoveToLineEnd Perehid u kinec ryadka MoveLeftByWord Perehid ulivo na odne slovo MoveUpByPage Perehid na odnu storinku nagoru i t d vidilennya vmistu SelectToLineEnd Vidilennya do kincya ryadka SelectLeftByWord Vidilennya slova livoruch i zmini formatuvannya ToggleBold i ToggleUnderline Vidilennya napivzhirnim i pidkreslennyam MediaCommands Cej klas vklyuchaye nabir komand dlya roboti z multimediya sered yakih komanda Play Vidtvoriti Pause Pauza NextTrack Perehid do nastupnoyi kompoziciyi i IncreaseVolume Zbilshennya guchnosti Vidklyuchennya komand vidbuvayetsya tak CommandBinding binding new CommandBinding ApplicationCommands Save binding Executed SaveCommand Executed binding CanExecute SaveCommand CanExecute this CommandBindings Add binding U comu obroblyuvachi podij potribno prosto pereviriti znachennya zminnoyi isDirty i vstanoviti vidpovidne znachennya dlya vlastivosti CanExecuteRoutedEventArg CanExecute private void SaveCommand CanExecute object sender CanExecuteRoutedEventArgs e e CanExecute isDirty Yaksho znachennyam vlastivosti is Dirty viyavlyayetsya false komanda vidklyuchayetsya robitsya nedostupnoyu a yaksho true to navpaki vklyuchayetsya Bez prapora CanExecute bude zberigatisya same ostannye znachennya Podiyi sho marshrutizuyutsya Kozhnij rozrobnik sho vikoristovuye NET znajommij z ponyattyam podiyi ce povidomlennya sho posilayetsya ob yektom napriklad elementom WPF shob povidomiti kod pro te sho vidbulosya shos vazhlive WPF polipshuye model podij NET zavdyaki novij koncepciyi marshrutizaciyi podij Marshrutizaciya dozvolyaye podiyi vinikati v odnomu elementi a generuvatisya v inshomu Napriklad marshrutizaciya podij dozvolyaye klacannyu sho pochalosya v knopci paneli instrumentiv generuvatisya v paneli instrumentiv a potim u vikni sho vmishaye panel i tilki potim obroblyatisya vashim kodom Marshrutizaciya podij proponuye bilshu gnuchkist dlya napisannya lakonichnogo kodu sho zmozhe obroblyati podiyi v bilshe zruchnomu dlya cogo misci Vona neobhidna takozh dlya roboti z modellyu vmistu WPF yaka dozvolyaye stvoryuvati prosti elementi napriklad knopki z desyatkiv okremih ingrediyentiv kozhnij z yakih maye svij vlasnij nabir podij Ci podiyi buvayut troh vidiv Pryami podiyi direct event podibni do zvichajnih podij NET Voni vinikayut v odnomu elementi i ne peredayutsya v inshij Napriklad MouseEnter vinikaye koli pokazhchik mishi navoditsya na element ye prostoyu podiyeyu Podiyi sho pidnimayutsya bulbashkovi podiyi bubbling event mandruyut nagoru iyerarhiyeyu Napriklad MouseDown ye podiyeyu sho pidnimayetsya Vona vinikaye v elementi na yakomu bulo zrobleno klacannya Potim vona peredayetsya vid cogo elementa do batka potim do batka cogo batka i tak dali Cej proces trivaye doti poki WPF ne dosyagne vershini dereva elementiv Tunelni podiyi tunneling event peremishayutsya vniz iyerarhiyeyu Voni nadayut mozhlivist poperedno pereglyadati i mozhlivo zupinyati podiyu do togo yak vono dijde do vidpovidnogo elementa keruvannya Napriklad PreviewKeyDown dozvolyaye perervati natiskannya klavishi spochatku na rivni vikna a potim u bilsh specifichnih kontejnerah do tih pir poki vi ne dijdete do elementa sho mav fokus u moment natiskannya klavishi Popri te sho kozhnij element maye najshirshij spektr podij najvazhlivishi podiyi zvichajno dilyatsya na chotiri opisanih nizhche kategoriyi Podiyi chasu isnuvannya Ci podiyi vinikayut koli element iniciyalizuyetsya zavantazhuyetsya abo vivantazhuyetsya Podiyi mishi Ci podiyi ye rezultatom dij mishi Podiyi klaviaturi Ci podiyi ye rezultatom dij klaviaturi napriklad natiskannya klavishi Podiyi pera Ci podiyi ye rezultatom vikoristannya pera stylus Razom podiyi mishi klaviaturi j pera vidomi yak podiyi vvedennya Fokus U sviti Windows koristuvach mozhe pracyuvati odnochasno z odnim elementom keruvannya Element keruvannya sho u cej moment chasu oderzhuye natiskannya klavishi koristuvachem perebuvaye u fokusi Inodi takij element vimalovuyetsya trohi inakshe Napriklad knopka WPF zdobuvaye sinij vidtinok shob svidchit pro te sho vona perebuvaye u fokusi Shob element keruvannya mig oderzhuvati fokus jogo vlastivosti Focusable potribno privlasniti znachennya true Za zamovchuvannyam vono ye takim dlya vsih elementiv keruvannya Dosit cikavo te sho vlastivist Focusable viznachayetsya yak chastina klasu UIElement a ce oznachaye sho inshi elementi yaki ne ye elementami keruvannya tezh mozhut oderzhuvati fokus Zvichajno v klasah yaki ne viznachayut elementi keruvannya vlastivist Focusable za zamovchuvannyam maye znachennya false Prote vi mozhete privlasniti jomu true Sprobujte zrobiti ce na prikladi kontejnera Stack Panel koli vin bude oderzhuvati fokus na krayah paneli bude z yavlyatisya punktirna ramka Shob peremistiti fokus iz odnogo elementa na inshij koristuvach mozhe klacnuti knopkoyu mishi abo skoristatisya klavisheyu lt Tab gt i klavishami keruvannya kursorom U poperednih seredovishah rozrobki programisti dodavali bagato zusil dlya togo shob klavisha lt Tab gt peredavala fokus za zakonami logiki zvichajno livoruch pravoruch a potim dolilic vikna i shob pri pershomu vidobrazhenni vikna fokus peredavavsya neobhidnomu elementu keruvannya V WPF taka dodatkova robota potribno duzhe ridko oskilki WPF vikoristovuye iyerarhichne komponuvannya elementiv dlya realizaciyi poslidovnosti perehodu za dopomogoyu klavishi tabulyaciyi Faktichno pri natiskanni klavishi lt Tab gt zdijsnyuyetsya perehid do pershogo nashadka v potochnomu elementi abo yaksho potochnij element ne maye nashadka do nastupnogo nashadka sho perebuvaye na tomu zh rivni Yaksho vi hochete keruvati poslidovnistyu perehodu za dopomogoyu klavishi tabulyaciyi vi mozhete zadati vlastivist Tablndex kozhnogo elementa keruvannya shob viznachiti jogo misce v chislovomu poryadku Element keruvannya vlastivist Tablndex yakogo maye znachennya 0 oderzhuye fokus pershim potim fokus oderzhuye element iz bilshim znachennyam ciyeyi vlastivosti napriklad 1 2 3 i t d Yaksho kilka elementiv mayut odnakovi znachennya vlastivosti TabIndex WPF vikonuye avtomatichnu poslidovnist peredachi fokusa vidpovidno do yakoyi fokus oderzhuye najblizhchij element u poslidovnosti Osoblivosti priv yazki ta vzayemodiyi z danimiPriv yazka danih Priv yazka danih ce tradiciya dobuvannya informaciyi z ob yekta j vidobrazhennya yiyi v koristuvalnickomu interfejsi zastosunka bez napisannya kodu sho vikonuye vsyu cyu robotu Chasto tovsti kliyenti vikoristovuyut dvonapravlenu priv yazku danih sho dodaye mozhlivosti zashtovhuvannya informaciyi z koristuvalnickogo interfejsu nazad v deyakij ob yekt znovu zh taki z minimalnim koduvannyam abo vzagali bez nogo Oskilki bagato Windows zastosunkiv pov yazani z danimi i vsi voni v pevnij chas mayut potrebu u vzayemodiyi z danimi priv yazka danih perebuvaye v centri uvagi takoyi tehnologiyi koristuvalnickih interfejsiv yak WPF Rozroblyuvachi sho prijshli do WPF z dosvidom roboti v Windows Forms znajdut u priv yazci danih WPF bagato shozhogo z tim do chogo voni zvikli Yak i v Windows Forms priv yazka danih WPF dozvolyaye stvoryuvati priv yazki yaki vityagayut informaciyu praktichno z bud yakoyi vlastivosti bud yakogo elementa WPF takozh vklyuchaye nabir oblikovih elementiv keruvannya yaki mozhut obroblyati cili kolekciyi informaciyi j dozvolyayut zdijsnyuvati navigaciyu po cij informaciyi Odnak vidbulisya j istotni zmini v sposobah priv yazki danih sho vidbuvayutsya za lashtunkami z yavilasya deyaka vrazhayucha nova funkcionalnist a takozh mozhlivosti tonkogo nastroyuvannya Bagato koncepcij zalishilisya kolishnimi ale kod zminivsya Najprostishij scenarij priv yazki danih skladayetsya v tomu sho vash vihidnij ob yekt ye elementom WPF a vihidna vlastivist vlastivistyu zalezhnostej Ce poyasnyuyetsya tim sho vlastivosti zalezhnostej mayut ubudovanu pidtrimku povidomlen pro zmini U rezultati koli vi minyayete znachennya vlastivosti zalezhnostej vihidnogo ob yekta priv yazane vlastivist u cilovomu ob yekti obnovlyayetsya avtomatichno Ce same te sho vam potribno i dlya cogo ne potribno buduvati niyakoyi dodatkovoyi infrastrukturi Shob zrozumiti yak mozhna priv yazati odin element do inshogo rozglyanemo priklad nastupnogo vikna Vono mistit dva elementi keruvannya Slider i TextBlock z yedinim ryadkom tekstu Yaksho peretyagnuti bigunok vpravo rozmir shriftu tekstu negajno zbilshitsya Yaksho zrushiti jogo vlivo rozmir shriftu zmenshitsya Yasno sho bulo b zovsim nevazhko zaprogramuvati take povodzhennya v kodi Dlya cogo vam usogo lishe znadobilosya b reaguvati na podiyu ValueChanged i kopiyuvati potochne znachennya bigunka v TextBlock Odnak priv yazka danih dozvolyaye zrobiti ce she prostishe Pri vikoristanni priv yazki danih vam ne potribno vnositi niyakih zmin u vihidnij ob yekt u comu vipadku Slider Prosto skonfigurujte jogo shob vin prijmav pravilnij diapazon znachen yak ce zvichajno robitsya lt Slider Name sliderFontSize Margin 3 Minimum l Maximum 40 Value 10 TickFrequency l TickPlacement TopLeft gt lt Slider gt Priv yazka zadayetsya v elementi TextBlock Zamist ustanovki FontSize iz zastosuvannyam literalnogo znachennya vi vikoristovuyete virazhennya priv yazki yak pokazano nizhche lt TextBlock Margin 10 Text Simple Text Name lblSampleText FontSize Binding ElementName sliderFontSize Path Value gt lt TextBlock gt Virazhennya priv yazki danih vikoristovuyut rozshirennya rozmitki XAML zvidsi j figurni duzhki Virazhennya pochinayetsya zi slova Binding oskilki vi stvoryuyete ekzemplyar klasu System Windows Data Binding Hocha vi mozhete skonfiguruvati ob yekt Binding dekilkoma sposobami u danij situaciyi potribno vstanoviti vsogo dvi vlastivosti ElementName sho vkazuye element dzherelo i Path sho vkazuye yaka same vlastivist priv yazuyetsya elementa dzherela Varto nagolosit na tomu sho WPF ne zbudzhuye vinyatkiv shob spovistiti vas pro problemi priv yazki danih Yaksho vi specifikuyete neisnuyuchij element abo vlastivist to ne oderzhite niyakoyi vkazivki na taku pomilku zamist cogo dani prosto ne z yavlyatsya v cilovij vlastivosti Stvorennya priv yazki v kodi Pri pobudovi vikna zvichajno najkrashe povidomlyati vashe virazhennya priv yazki v kodi rozmitki XAML vikoristovuyuchi rozshirennya Binding Odnak priv yazku mozhna takozh stvoriti j u programnomu kodi Ot yak mozhna stvoriti priv yazku TextBlock pokazanu v poperednomu prikladi Binding binding new Binding PRO binding Source sliderFontSize binding Path new PropertyPath Value binding Mode BindingMode TwoWay IblSampleText SetBinding TextBlock TextProperty binding Yaksho vi hochete vidaliti priv yazku shob ustanovlyuvati znachennya vlastivosti zvichajnim sposobom vam znadobitsya dopomoga metodiv ClearBinding i ClearAllBindings Napryamok priv yazki Doteper vi poznajomilisya z odnospryamovanoyu j dvonapravlenoyu priv yazkami Naspravdi WPF dozvolyaye pri ustanovci vlastivosti Binding Mode zastosovuvati odne z p yati znachen pererahuvannya System Windows Data BindingMode Oneway Cilova vlastivist onovlyuyetsya pri zmini vlastivosti dzherela TwoWay Cilova vlastivist obnovlyayetsya pri zmini vlastivosti dzherela i vlastivist dzherelo obnovlyayetsya pri zmini cilovoyi vlastivosti OneTime Cilova vlastivist ustanovlyuyetsya spokonvichno na osnovi znachennya vlastivosti dzherela Odnak iz cogo momentu zmini ignoruyutsya yaksho tilki priv yazka ne vstanovlena na zovsim inshij ob yekt Zvichajno vi vikoristovuyete cej metod dlya skorochennya nakladnih vitrat yaksho znayete sho vihidna vlastivist ne bude zminyuvatisya OneWaySource Podibno OneWay tilki navpaki Vihidna vlastivist onovlyuyetsya pri zmini cilovoyi vlastivosti sho mozhe zdatisya trohi zadom napered ale cilova vlastivist nikoli ne onovlyuyetsya Default Tip priv yazki zalezhit vid cilovoyi vlastivosti Vono bude abo TwoWay dlya vstanovlyuvanih koristuvachem vlastivostej takih yak TextBox Text abo OneWay dlya vsih inshih Vsi priv yazki vikoristovuyut cej pidhid yaksho tilki vi ne vkazhete inshoyi Priv yazka koristuvalnickih ob yektiv do bazi danih Koli rozroblyuvachi chuyut termin priv yazka danih to voni chasto dumayut pro odin specifichnij yiyi zastosunok oderzhanni informaciyi z bazi danih i vidobrazhenni na ekrani z minimalnim obsyagom kodu abo vzagali bez nogo Yak vi vzhe bachili priv yazka danih v WPF nabagato shirshe ponyattya Navit yaksho vash zastosunok nikoli ne vstupaye v kontakt iz bazoyu danih vse taki zberigayetsya jmovirnist zastosuvannya priv yazki danih dlya avtomatizaciyi vzayemodiyi elementiv mizh soboyu abo translyaciyi ob yektnoyi modeli v naochne podannya Odnak vi povinni znati bagato podrobic pro priv yazku ob yektiv dlya chogo mi rozglyanemo tradicijnij priklad sho zapituye j onovlyuye tablicyu bazi danih Persh nizh zvernutisya do cogo vam nalezhit dovidatisya pro specialnij komponent dostupu do danih i ob yekti danih vikoristovuvanomu v comu prikladi Pri stvorenni klasu dostupu do danih vi povinni sliduvati dekilkom bazovim pravilam yaki opisani nizhche Vidkrivati j zakrivati z yednannya shvidko Vidkrivajte z yednannya z bazoyu danih pri kozhnomu vikliku metodu j zakrivajte pered zavershennyam metodu Takim chinom z yednannya ne zalishatsya vidkritimi z neoberezhnosti Odin zi sposobiv garantuvati zakrittya z yednannya v nalezhnij chas vikoristovuvati blok using Realizuvati obrobku pomilok Vikoristovujte obrobku pomilok shob garantuvati zakrittya z yednan navit u vipadku viniknennya vinyatkiv Doderzhuvatisya praktiki dizajnu sho ne pidtrimuye stan Peredavajte vsyu neobhidnu dlya metodu informaciyu v jogo parametrah i povertajte vsi vityagnuti dani cherez znachennya povernennya Ce dozvolit uniknuti uskladnen u bagatoh scenariyah napriklad yaksho vi hochete stvoriti bagatopotokovij zastosunok abo roztashuvati vash komponent bazi danih na serveri Zberigati ryadok pidklyuchennya v odnomu misci V ideali takimi miscyami povinen buti konfiguracijnij fajl vashogo zastosunka Priv yazka do virazhennya LINQ Odniyeyi iz prichin perehodu vid NET 3 0 do NET 3 5 ye pidtrimka movi integrovanih zapitiv Language Integrated Query LINQ Vikoristovuyuchi pidtrimku vklyuchenu v NET 3 5 vi mozhete vikoristovuvati odnakovo strukturovani zapiti LINQ dlya dobuvannya danih z kolekciyi sho perebuvaye v pam yati z fajlu XML abo z bazi danih SQL Server Yak i inshi movi zapitiv LINQ dozvolyaye filtruvati sortuvati j transformuvati dani Hocha LINQ vihodit za ramki temi sho rozglyadayetsya v danomu rozdili vi mozhete bagato chogo dovidatisya pro nogo iz prostogo priklada Napriklad pripustimo sho u vas ye kolekciya ob yektiv Product z imenem products i vi hochete stvoriti drugu kolekciyu sho mistit tilki ti produkti cina yakih perevishuye 100 Vikoristovuyuchi procedurnij kod Vi mozhete napisati shos take Oderzhati povnij spisok produktiv List lt Product gt products App StoreDB GetProducts Stvoriti drugu kolekciyu z potribni produktam List lt Product gt matches new List lt Product gt foreach Product product in products if product UnitCost gt 100 matches Add product Vikoristovuyuchi LINQ vi mozhete napisati nastupne nabagato bilshe zruchne virazhennya Oderzhati povnij spisok produktiv List lt Product gt products App StoreDB GetProducts Stvoriti drugu kolekciyu z vidpovidnimi produktami IEnumerable lt Product gt matches from product in products where product UnitCost gt 100 select product Cej priklad vikoristovuye API Interfejs LINQ to Collections tobto zastosovuye virazhennya LINQ dlya vityagnennya zapitu danih sho znahodyatsya v pam yati Virazhennya LINQ vikoristovuyut nabir novih klyuchovih sliv movi vklyuchayuchi from in i select Ci klyuchovi slova LINQ stanovlyat nevid yemnu chastin movi S ShabloniViyavlyayetsya sho v kozhnogo elementa keruvannya ye vbudovanij recept sho viznachaye te yak vin povinen vizualizuvatis u viglyadi grupi bilshe bazovih elementiv Cej recept nazivayetsya shablonom elementa keruvannya control template i viznachayetsya za dopomogoyu bloku XAML rozmitki Koli stvoryuyetsya shablon elementa keruvannya novij shablon zaminyaye isnuyuchij povnistyu Ce zabezpechuye najvishij stupin gnuchkosti ale pri comu takozh she j trohi uskladnyuye zhittya U bilshosti vipadkiv pered stvorennyam svoyeyi vlasnoyi adaptovanoyi versiyi potribno pereglyanuti standartnij shablon sho vikoristovuye danij element keruvannya U deyakih vipadkah specialnij shablon elementa keruvannya mozhe povnistyu povtoryuvati standartnij shablon za vinyatkom yakoyis odniyeyi neznachnoyi zmini U dokumentaciyi WPF kod XAML standartnih shabloniv elementiv keruvannya ne navedenij Odnak vsyu neobhidnu informaciyu mozhna oderzhati programno U cilomu potribno zrobiti nastupne vityagti shablon elementa keruvannya z jogo vlastivosti Template yake ye chastinoyu klasu Control i potim seriyalizuvati jogo v XAML za dopomogoyu klasu XamlWriter StiliStil ce kolekciya znachen vlastivostej yaki mozhut buti zastosovani do elementa Sistema stiliv WPF graye tu zh rol sho j standart kaskadnih tablic stiliv Cascading Style Sheet CSS graye v HTML kodi rozmitki Podibno do CSS stili WPF dozvolyayut viznachati zagalnij nabir harakteristik formatuvannya j zastosovuvati yih u vsomu zastosunku dlya zabezpechennya uzgodzhenosti Yak i CSS stili WPF mozhut pracyuvati avtomatichno priznachatisya dlya elementiv konkretnogo tipu j kaskaduvatis cherez derevo elementiv Odnak stili WPF ye mogutnishimi tomu sho mozhut ustanovlyuvati bud yaku vlastivist zalezhnostej Perevagi stiliv pokazani na nastupnomu prostomu prikladi Nehaj treba standartizuvati vikoristovuvanij u vikni stil Najprostishim pidhodom bude vstanoviti vidpovidalni za shrift vlastivosti utrimuyuchij cej shrift vikna Do chisla takih vlastivostej yaki do rechi viznachayutsya v klasi Control stavlyatsya FontFamily For tSize FontWeight dlya shriftu z napivzhirnim nakreslennyam FoncStyle dlya shriftu z kursivnim nakreslennyam i Font St retch Zavdyaki funkciyi spadkuvannya znachen vlastivostej pri ustanovci cih vlastivostej na rivni vikna vsi elementi useredini vikna oderzhat odnakovi znachennya yaksho tilki voni yavno ne pereviznachayut yih Teper davajte vizmemo inshu situaciyu Uyavit sho potribno zablokuvati shrift vikoristovuvanij dlya yakihos pevnih elementiv u koristuvalnickomu interfejsi Yaksho ye mozhlivist izolyuvati ci elementi v specialnij kontejner napriklad yaksho voni vse perebuvayut useredini odnogo elementa keruvannya Grid abo StackPanel todi v principi mozhna skoristatisya tim zhe samim pidhodom i vstanoviti vidpovidalni za shrift vlastivosti cogo kontejnera Odnak u realnomu zhitti vse zazvichaj viyavlyayetsya ne tak prosto Napriklad mozhe buti neobhidno shob u vsih knopok bula svoya garnitura j rozmir shriftu sho ne zalezhit vid parametriv shriftu yaki vikoristovuyutsya v inshih elementah U takomu vipadku potribnij sposib sho dozvolyaye viznachiti ci detali v odnomu misci j povtorno vikoristovuvati yih skriz de voni budut neobhidni Stili proponuyut idealne rishennya Mozhna viznachiti odin yedinij stil sho vpakovuye vsi vlastivosti yaki potribno vstanoviti Napriklad mozhna nadijti tak yak pokazano nizhche lt Window Resources gt lt Style x Key BigFontButtonStyle gt lt Setter Property Control FontFamily Value Times New Roman gt lt Setter Property Control FontSize Value 8 gt lt Setter Property Control FontWeight Value Bold gt lt Style gt lt Window Resources gt U comu kodi rozmitki stvoryuyetsya odin yedinij resurs ob yekt System Windows Style U comu ob yekti vtrimuyetsya kolekciya Setters iz troma ob yektami Setter po odnomu dlya kozhnoyi vlastivosti sho potribno vstanoviti U kozhnomu ob yekti Setter vkazuyetsya im ya vlastivosti na yake vin vplivaye i znachennya sho vin povinen zastosovuvati do ciyeyi vlastivosti Yak i vsi resursi ob yekt stilyu maye klyuchove im ya za yakim jogo mozhna pri neobhidnosti vityagati z kolekciyi U comu razi ce klyuchove im ya viglyadaye yak BigFontButtonStyle Za zagalnoprijnyatoyu zgodoyu klyuchovi imena stiliv zvichajno zakinchuyutsya slovom Style Sistema stiliv dodaye bezlich perevag Vona ne tilki dozvolyaye stvoryuvati grupi parametriv chitko zv yazanih mizh soboyu ale j takozh sproshuye kod rozmitki polegshuyuchi zastosuvannya cih parametriv Najkrashe te sho stil mozhna zastosovuvati ne turbuyuchis pro te yaki vlastivosti vin ustanovlyuye U poperednomu prikladi parametri shriftu buli organizovani v stil za nazvoyu BigFontButtonStyle Yaksho piznishe raptom znadobitsya zabezpechiti knopki z velikim shriftom oblastyami Padding i Margin u kod mozhna bude takozh duzhe legko dodatkovo dodati vidpovidno vlastivosti Padding i Margin pislya chogo vsi sho vikoristovuyut danij stil knopki avtomatichno oderzhat novi parametri stilyu Kolekciya Setters ye najvazhlivishoyu vlastivistyu klasu Style Ale v principi klyuchovimi vvazhayutsya cilih p yat vlastivostej korotkij opis yakih navedeno v tabl Setters Kolekciya ob yektiv Setter abo EventSetter yaki avtomatichno vstanovlyuyut znachennya vlastivostej i dodayut obroblyuvachi podij Triggers Kolekciya ob yektiv yaki uspadkovuyutsya vid TriggerBase i dozvolyayut avtomatichno zminyuvati parametri stilyu Parametri stilyu mozhut zminyuvatisya napriklad abo u vipadku zmini znachennya yakoyis inshoyi vlastivosti abo u vipadku viniknennya yakoyi nebud podiyi Resources Kolekciya resursiv yaki povinni vikoristovuvatisya zi stilyami Napriklad mozhe viniknuti neobhidnist vikoristovuvati odin yedinij ob yekt dlya ustanovki bilsh nizh odniyeyi vlastivosti U takomu vipadku bilshe efektivnim variantom bude stvoriti ob yekt yak resurs i potim vikoristovuvati cej resurs v ob yekti Setter chim stvoryuvati jogo u viglyadi chastini kozhnogo ob yekta Setter vikoristovuyuchi vkladeni deskriptori BasedOn Vlastivist sho dozvolyaye stvoryuvati bilshe specializovanij stil sho uspadkovuye i pri bazhanni sho pereviznachaye parametri inshogo stilyu TargetType Vlastivist sho identifikuye tip elementa na yakij diye danij stil Cya vlastivist dozvolyaye stvoryuvati yak ob yekti Setter sho vplivayut tilki na pevni elementi tak i ob yekti Setter sho avtomatichno vstupayut u silu dlya elementiv konkretnogo tipu Vlasne kazhuchi zastosovuvati stili j resursi razom zovsim neobov yazkovo Napriklad stil pevnoyi knopki mozhna viznachiti i prosto pryamo zapovnivshi yiyi kolekciyu Style yak pokazano nizhche lt Button Padding 5 Margin 5 gt lt Button Style gt lt Style gt lt Setter Property Control FontFamily Value Times New Roman gt lt Setter Property Control FontSize Value 8 gt lt Setter Property Control FontWeight Value Bold gt lt Style gt lt Button Style gt lt Button Content gt A Customized Button lt Button Content gt lt Button gt Avtomatichne zastosuvannya stiliv za tipom Poki sho bulo pokazano yak mozhna stvoryuvati imenovani stili j posilatisya na nih u kodi rozmitki Odnak isnuye she odin pidhid Mozhna robiti tak shob do elementiv pevnogo tipu stil zastosovuvavsya avtomatichno Robitsya ce dovoli prosto Use sho potribno ce vstanoviti vlastivist TargetType tak shob vono vkazuvalo na potribnij tip yak opisuvalosya ranishe i vzagali ne vikoristovuvati klyuchove im ya Todi WPF ustanovlyuye klyuchove im ya neyavno za dopomogoyu rozshirennya rozmitki tipu yak pokazano nizhche h Keu h Turi Button Dali stil avtomatichno zastosovuyetsya do bud yakih knopok sho zustrichayutsya nizhche v derevi elementiv Napriklad yaksho viznachiti stil podibnim chinom u vikni vin bude zastosovuvatisya do kozhnoyi knopki v comu vikni za umovi vidsutnosti dali v kodi she odnogo stilyu sho zaminyaye jogo Hocha avtomatichno zastosovuvani stili j zruchni voni mozhut uskladnyuvati dizajn Nizhche pererahovano kilka mozhlivih prichin U skladnomu vikni z velikoyu kilkistyu stiliv i rivniv stiliv staye vazhko vidslidkovuvati te chi vstanovlyuyetsya dana vlastivist za dopomogoyu spadkuvannya znachen vlastivostej abo za dopomogoyu stilyu i yaksho vono vstanovlyuyetsya za dopomogoyu stilyu to za dopomogoyu yakogo same U rezultati pri neobhidnosti zminiti navit yaku nebud prostu detal mozhe znadobitisya pereglyad kodu rozmitki vsogo vikna Formatuvannya u vikni chasto spochatku ye bilshe zagalnim a potim postupovo uskladnyuyetsya U razi zastosuvannya do vikna avtomatichnih stiliv de nebud na rannomu etapi shvidshe za vse dali ci stili bude potribno pereviznachati v bagatoh miscyah za dopomogoyu yavnih stiliv A ce znachno uskladnyuye ves dizajn Nabagato prostishe bude stvoriti imenovani stili dlya kozhnoyi kombinaciyi neobhidnih harakteristik formatuvannya j zastosovuvati yih za imenem U razi stvorennya avtomatichnogo stilyu napriklad dlya elementa TextBox obov yazkovo prijdetsya vnositi zmini v inshi elementi keruvannya yaki vikoristovuyut cej element TextBlock napriklad u kerovanij shablonom element keruvannya ListBox Shob uniknuti takih problem najkrashe zastosovuvati avtomatichni stili rozvazhlivo Napriklad mozhe viyavitisya najkrashe vikoristovuvati avtomatichnij stil ne dlya vsogo vikna a tilki dlya dodannya odnomanitnogo zapovnennya knopkam abo dlya keruvannya parametrami poliv elementiv TextBox u konkretnomu kontejneri LokalizaciyaLokalizaciya WPF zastosunkiv konceptualno vidriznyayetsya vid pidhodu do bagatomovnosti interfejsiv u WinForms Tut odiniceyu lokalizaciyi ye XAML fajl z tehnichnoyi tochki zoru skompilovanij BAML pecypc yakij vbudovuyetsya v zastosunok Pri bazhanni pidtrimuvati tri rizni movi neobhidno bude vklyuchiti tri BAML pecypca WPF bude vibirati z nih vidpovidnij na pidstavi potochnih nastroyuvan kulturi na tomu komp yuteri na yakomu vikonuyetsya zastosunok Z tehnichnoyi tochki zoru WPF bude vikoristovuvati dlya prijnyattya rishennya znachennya vlastivosti CurrentUICulture z potoku koristuvackogo interfejsu Zvichajno u takomu procesi ne bulo b osoblivogo zmistu yakbi potribno bulo stvoryuvati i rozgortati universalne skladannya z usima lokalizovanimi resursami Ce bulo b ne krashe nizh stvoryuvati okremi versiyi zastosunka dlya kozhnoyi movi oskilki zastosunok dovodilosya bi povnistyu komponuvati zanovo pri kozhnij neobhidnosti dodati pidtrimku dlya yakoyis novoyi kulturi abo neobhidnosti nastroyiti tekst v odnomu iz uzhe isnuyuchih resursiv Na shastya v NET cya problema virishuyetsya za dopomogoyu pidleglih zbirok satellite assemblies yaki pracyuyut iz zastosunkom ale zberigayutsya v okremih katalogah Pri stvorenni lokalizovanogo WPF zastosunka kozhnij lokalizovanij BAML pecypc mistitsya v okremij pidleglij zbirci Dlya togo shob zastosunok mig vikoristovuvati cyu zbirku yiyi rozmishuyut v pidpapci pid osnovnoyu papkoyu zastosunka napriklad z imenem fr FR priznachenoyi dlya francuzkoyi movi Franciya Pislya cogo zastosunok mozhe zv yazuvatisya iz ciyeyu pidlegloyu zbirkoyu avtomatichno shlyahom vikoristannya tehnologiyi zonduvannya probing sho ye chastinoyu NET Framework pochinayuchi z versiyi 1 0 Najbilshi trudnoshi v lokalizaciyi zastosunka polyagayut u robochomu procesi inshimi slovami v tomu yak vityagti XAML fajli iz proektu zrobiti yih lokalizovanimi skompilyuvati v pidlegli skladannya j potim povernuti nazad v zastosunok Stvorennya lokalizovanih koristuvalnickih interfejsiv Persh nizh pochinati sho nebud perekladati spochatku potribno rozibratisya z tim yak zastosunok bude reaguvati na zminu vmistu Napriklad yaksho podvoyiti dovzhinu vsogo tekstu v koristuvalnickomu interfejsi to yak zminitsya zagalne komponuvannya vikna U vipadku yaksho bulo rozroblene dijsno gnuchke komponuvannya niyakih problem viniknuti ne povinne Interfejs povinen buti zdatnij pidbuduvatisya vidpovidno do dinamichnogo vmistu Nizhche opisani deyaki rekomendaciyi sho garantuyut korektne vidobrazhennya lokalizovanih elementiv Ne zastosovuvati zhorstko zakodovani znachennya shirini abo visoti Ustanovlyuvati dlya vlastivosti Window SizeToContent znachennya Width Height abo WidthAndHeight tak shob rozmir vikna mig zbilshuvatisya v miru neobhidnosti Znov taki ce ye obov yazkovim ne zavzhdi vse zalezhit vid strukturi vikna ale v deyakih vipadkah buvaye duzhe navit korisnim Vikoristovuvati dlya vpakuvannya velikih obsyagiv tekstu element ScrollViewer Pidgotovka zastosunka dlya lokalizaciyi Nastupnij krok vklyuchiti pidtrimku lokalizaciyi dlya proektu Dlya cogo bude potribno vnesti tilki odnu zminu a same dodati u fajl csproj proektu de nebud u pershomu rozdili lt PropertyGroup gt nastupnij element lt UICulture gt uk UK lt UICulture gt Ce vkazhe kompilyatorovi sho movoyu kulturoyu za zamovchuvannyam dlya zastosunka povinen buti napriklad ukrayinska pri neobhidnosti mozhna vibrati j inshu movu Pislya vnesennya cogo korektuvannya proces komponuvannya zminitsya Pri nastupnij kompilyaciyi zastosunka bude stvorenij pidkatalog z imenem uk UK Useredini ciyeyi papki bude perebuvati pidlegla zbirka z takim zhe imenem yak i v zastosunka i rozshirennyam resources dll napriklad LocalizableApplication resources dll U comu skladanni budut utrimuvatisya vsi skompilovani BAML resursi dlya zastosunka yaki ranishe zberigalisya v osnovnomu skladanni zastosunka Teper pri zapusku danogo zastosunka zagalnomovne vikonuyuche seredovishe CLR bude avtomatichno shukati pidlegli skladannya u vidpovidnomu katalozi na pidstavi regionalnih parametriv komp yutera i zavantazhuvati vidpovidnij lokalizovanij resurs Napriklad pri zapusku zastosunka na komp yuteri z kulturoyu fr FR seredovishe CLR bude vidshukuvati pidkatalog fr FR i vikoristovuvati pidlegli skladannya yaki viyavit tam Ce oznachaye shob dodati v lokalizovanij zastosunok pidtrimku dlya dodatkovih kultur bude potribno prosto dodati vidpovidni dodatkovi pidkatalogi j pidlegli zbirki ne turbuyuchis pro vihidnij vikonuvanij fajl Koli seredovishe CLR pochinaye zonduvati pidkatalogi na predmet nayavnosti pidlegloyi zbirki vono sliduye kilkom prostim pravilam chergovosti Spochatku vono pereviryaye najspecifichnishij iz vsih dostupnih katalogiv Ce oznachaye sho vono shukaye pidlegle skladannya priznachene i dlya potochnoyi movi i regionu na zrazok fr FR Yaksho jomu ne vdayetsya vidshukati takij katalog vono pochinaye shukati pidleglu zbirku priznachenu dlya potochnoyi movi takogo yak fr Yaksho jomu ne vdayetsya znajti i takij katalog todi vono generuye vinyatok IOException Cej spisok ye trohi sproshenim Tim hto virishit zastosovuvati globalnij kesh zbirok Global Assembly Cache GAC dlya spilnogo vikoristannya yakihos komponentiv u vsomu komp yuteri varto znati sho NET faktichno pereviryaye GAC na pochatku krokiv 1 i 2 Inakshe kazhuchi na pershomu kroci CLR seredovishe pereviryaye chi nemaye potribnoyi versiyi skladannya u keshi GAC i yaksho ye vikoristovuye jogo Te zh same vidbuvayetsya j na kroci 2 Proces perekladu Koli vsya neobhidna dlya lokalizaciyi infrastrukturi gotova zalishayetsya tilki stvoriti vidpovidni pidlegli skladannya z alternativnimi versiyami vikon u formi BAML i rozmistiti yih u vidpovidnih katalogah Vi poznachayete v zastosunku elementi yaki potribno lokalizuvati Pri bazhanni vi mozhete takozh dodati dodatkovi komentari dlya togo shob dopomogti perekladachevi Dali vi vityaguyete lokalizovani detali u fajl cvs tekstovij fajl iz rozdilnikami komami i vidpravlyayete jogo perekladachevi Pislya oderzhannya perekladenoyi versiyi cogo fajlu vi znovu zapuskayete utilitu locbaml shob zgeneruvati neobhidne pidlegle skladannya Pershe sho potribno zrobiti dodati v usi elementi yaki potribno lokalizuvati specialnij atribut Uid Napriklad lt Button x Uid Button1 Margin 10 Padding 3 gt A button lt Button gt Atribut Uid vidigraye rol podibnu tiyeyi sho vikonuye atribut Name u comu vipadku vin unikalnim chinom identifikuye knopku v konteksti odnogo XAML dokumentu Ce dozvolyaye vkazati lokalizovanij tekst tilki dlya ciyeyi knopki Odnak isnuyut kilka prichin togo chomu v WPF vikoristovuyetsya atribut Uid a ne znachennya Name odna z yakih polyagaye v tomu sho elementovi keruvannya im ya mozhe ne priznachatisya a vstanovlyuvatisya vidpovidno do riznih domovlenostej i zastosovuvatisya v kodi Naspravdi vlastivist Name ye takim fragmentom informaciyi sho lokalizuyetsya Hocha j neobov yazkovo ale atribut Uid najkrashe dodati do kozhnogo elementa v kozhnomu vikni zastosunka yakij lokalizuyetsya Ce mozhe stvoriti masu dodatkovih zusil odnak isnuye utilita msbuild ehe sho vmiye robiti ce avtomatichno Potribno prosto vikoristovuvati yiyi v takij sposib msbuild t updateuid LocalizableApplication csproj Tut peredbachayetsya sho atributi Uid potribno dodati v zastosunok za nazvoyu LocalizableApplication Yaksho potribno pereviriti chi u vsih elementiv ye atributi Uid i chi ne buv yakij nebud iz nih vipadkovo produblovanim mozhna vikoristati utilitu msbuild exe u takij sposib msbuild t checkuid LocalizableApplication csproj U razi generaciyi atributiv Uid za dopomogoyu msbuild voni vstanovlyuyutsya vidpovidno do imeni elementa keruvannya do yakogo stavlyatsya Dlya otrimannya vmistu vsih elementiv sluzhit utilita komandnogo ryadka locbaml U cej chas locbaml ne postavlyayetsya yak skompilovanij zasib Zamist cogo yiyi vihidnij kod dostupnij u viglyadi zrazka u dovidci Visual Studio u prisvyachenomu locbaml rozdili i povinen kompilyuvatisya vruchnu Vikoristovuyuchi locbaml varto obov yazkovo perebuvati same v tij papci u yakij utrimuyetsya skompilovane skladannya napriklad ce mozhe buti papka LocalizableApplication bin Debug Shob vityagti spisok detalej dlya lokalizaciyi potribno vkazati locbaml na pidleglu zbirku j zadati parametr parse yak pokazano nizhche locbaml parse en US LocalizableApplication resources dll Utilita locbaml vikonuye v pidlegli zbirci poshuk vsih nayavnih u nij skompilovanih BAML resursiv i generuye fajl cvs z detalyami U danomu prikladi cej fajl csv oderzhit im ya LocalizationApplication resources csv Kozhnij ryadok u otrimanomu fajli predstavlyaye odnu vlastivist dlya lokalizaciyi sho zastosovuvalosya dlya togo abo inshogo elementa v dokumenti XAML i skladayetsya iz semi pererahovanih nizhche znachen Im ya BAML pecypca napriklad LocalizableApplication g en US resources windowl baml Uid elementa j im ya vlastivosti sho pidlyagaye lokalizaciyi Napriklad StackPanel l System Windows FrameworkElement Margin Kategoriya lokalizaciyi Ce znachennya beretsya z pererahuvannya LocalizationCategory yake dopomagaye identifikuvati tip umistu sho predstavlyayetsya danoyu vlastivistyu dovgij tekst zagolovok shrift napis na knopci sho splivaye pidkazka j t d Znachennya sho pokazuye chi ye dana vlastivist prochitnoyu tobto predstavlenim u viglyadi tekstu v koristuvalnickomu interfejsi Vsi prochitni znachennya povinni lokalizuvatisya zavzhdi u toj chas yak nechitni znachennya mozhut vimagati a mozhut i ne vimagati lokalizaciyi Znachennya sho pokazuye chi mozhna znachennya danoyi vlastivosti zminyuvati perekladachevi Zavzhdi viglyadaye yak true yaksho tilki jogo specialno ne zminiti na protilezhne false Dodatkovi komentari yaki buli nadani dlya perekladacha Yaksho komentari ne nadavalisya ce znachennya bude porozhnim Znachennya vlastivosti Ce same ta detal sho i povinna lokalizuvatisya Teper vi maye nagodu vidkriti zgenerovanij fajl u tekstovomu redaktori j zaminiti pereklasti neobhidnij tekstovij kontent u vidpovidnu movu zberigshi pereklad u novij fajl Teper mozhna perehoditi do stvorennya pidleglih zbirok dlya inshih kultur Znov taki dlya vikonannya ciyeyi zadachi potribna utilita locbaml ale cogo razu yiyi varto vikoristovuvati z parametrom generate Ne zabuvajte pro te sho pidlegle skladannya bude mistiti alternativnu kopiyu kozhnogo cilogo vikna u viglyadi vkladenogo BAML pecypca Dlya togo shob stvoriti taki resursi utilita locbaml povinna pereglyanuti vihidnu pidleglu zbirku zaminiti vsi novi znachennya z perevedenogo fajlu cvs i potim zgeneruvati novu pidleglu zbirku A ce oznachaye sho vi povinni vkazati utiliti locbaml na vihidnu pidleglu zbirku j za dopomogoyu parametra trans na perekladenij spisok znachen Vi takozh povinni povidomiti yiyi yaku kulturu predstavlyaye ce skladannya za dopomogoyu parametra cul Majte na uvazi sho kulturi viznachayutsya za dopomogoyu dvoskladnih identifikatoriv yaki pererahovani v opisi klasu System Globalization Culturelnfo Nizhche pokazanij priklad sho ilyustruye vse ce locbaml generate en US LocalizableApplication resources dll trans LocalizableApplication resources French csv cul fr FR out fr FR Cya komanda robit opisani nizhche rechi Vikoristovuye vihidne pidlegle skladannya en US LocalizedApplication resources dll Vikoristovuye perekladenij cvs fajl French cvs Vikoristovuye kulturu francuzka mova Franciya Roztashovuye rezultat u pidpapku fr FR yaka povinna vzhe isnuvati Hocha mozhe zdatisya sho ce povinne vikonuvatisya neyavnim chinom na pidstavi vikoristovuvanoyi kulturi odnak danu detal vse taki varto nadavati obov yazkovo Pri vikonanni ciyeyi komandi utilita locbaml stvorit novu versiyu skladannya LocalizableApplication resources dll z perekladenimi znachennyami j pomistit yiyi v pidpapku zastosunku z imenem f r FR Teper u vipadku zapusku danogo zastosunka na komp yuteri de dlya parametra kulturi vstanovlena francuzka mova Franciya avtomatichno z yavitsya alternativna versiya vikna Zminiti kulturu mozhna v dostupnomu cherez panel keruvannya rozdili Regional and Language Options Mova j regionalni standarti abo za dopomogoyu kodu sho zminyuye parametr kulturi tilki potochnogo potoku Napriklad Thread CurrentThread CurrentUICulture new CultureInfo fr FR TransformaciyaVelicheznij obsyag zavdan pov yazanih z malyuvannyam mozhe buti sproshenij zavdyaki vikoristannyu transformaciyi ob yekta sho zminyuye sposib malyuvannya figuri abo elementa za dopomogoyu shovanogo zrushennya vikoristovuvanoyi yim koordinatnoyi sistemi B WPF transformaciyi predstavleni klasami uspadkovanimi vid abstraktnogo klasu System Windows Media Transform Mayut misce taki transformaciyi TranslaceTransform zmishaye vashu koordinatnu sistemu na pevnu h u velichinu Cya transformaciya zruchna yaksho vi hochete namalyuvati tu zh figuru v riznih miscyah RotateTransform povertaye vashu koordinatnu sistemu na Angle gradusiv namalovani figuri povertayutsya navkolo zadanoyi tochki Center Same parametr kuta animuyetsya vid 0 do 360 gradusiv u danomu prikladi ScaleTransform masshtabuye koordinatnu sistemu v bilshu abo menshu storonu Mozhna zastosovuvati riznij stupin masshtabuvannya za vimirami X i Y takim chinom roztyaguyuchi abo stiskayuchi figuru SkewTransform deformuye koordinatnu sistemu nahilyayuchi yiyi na pevne chislo gradusiv Napriklad yaksho namalyuvati kvadrat to pislya transformaciyi vin stane paralelogramom MatrixTransform modifikuye koordinatnu sistemu vikoristovuyuchi matrichne mnozhennya na priznachenu matricyu Ce najskladnisha transformaciya vona vimagaye pevnoyi matematichnoyi pidgotovki TransformGroup kombinuye kilka transformacij takim chinom sho voni mozhut zastosovuvatisya odnochasno Poryadok zastosuvannya transformacij vazhlivij vin vplivaye na kincevij rezultat Napriklad obertannya figuri za dopomogoyu RotateTransform z nastupnim peremishennyam yiyi za dopomogoyu TransiateTransform peremistit figuru v inshe misce chim yaksho vi spochatku peremistite yiyi a potim povernete AnimaciyaAnimaciya centralna chastina modeli WPF Ce znachit sho vam ne potribno vikoristovuvati tajmeri j kod obrobki podij shob privesti yiyi v diyu Zamist cogo vi stvoryuyete yiyi deklarativno ne napisavshi zhodnogo ryadka kodu S Takozh animaciya zovsim nepomitno sama integruyetsya u zvichajni vikna WPF i na storinki Napriklad yaksho vi animuyete knopku takim chinom sho vona drejfuye viknom prote vona pri comu prodovzhuye povoditisya yak knopka Yiyi mozhna stilizuvati vona prijmaye fokus i na nij mozhna klacnuti zapustivshi zvichajnij kod obroblyuvacha podiyi Uyavit priklad ukraj prostoyi animaciyi sho rozshiryuye knopku Koli vi klacayete na knopci WPF plavno rozsovuye obidvi storoni knopki poki vona ne zapovnit vikno Shob stvoriti takij efekt vi vikoristovuyete animaciyu sho modifikuye vlastivist Width knopki Nizhche navedenij kod sho stvoryuye j zapuskaye cyu animaciyu pri klacanni na knopci DoubleAnimation widthAnimation new DoubleAnimation widthAnimation From 160 widthAnimation To this Width 30 widthAniamtion Duration TimeSpan FromSeconds 5 cmdGrow BeginAnimation Button WidthProperty widthAnimation Ye tri detali yaki stanovlyat neobhidnij minimum dlya opisu animaciyi sho vikoristovuye linijnu interpolyaciyu pochatkove znachennya From kinceve znachennya To i chas za yake animaciya povinna vikonatis Duration U danomu prikladi kinceve znachennya zasnovane na potochnij shirini utrimuyuchu knopku vikna Bitovi efektiBitovi efekti WPF gotovi vizualni efekti yaki mozhna zastosuvati do bud yakogo elementa Cil efektiv nadati prostij deklarativnij sposib udoskonalennya zovnishnogo viglyadu tekstu zobrazhen knopok tosho Zamist napisannya vlasnogo kodu malyuvannya vi vikoristovuyete odin iz klasiv spadkoyemciv BitmapEffect iz prostoru imen System Windows Media Effects shob oderzhati mittyevij efekt tipu rozmivannya vidbliskiv i tinej Mayut misce taki efekti BlurBitmapEffect rozmivaye vmist elementa BevelBitmapEffect dodaye opuklu ramku navkolo vmistu Cej efekt realizovano stosovno knopok Garazd ta Vidmina EmbossBitmapEffect stvoryuye efekt tisnennya vidilyayuchi granici j liniyi yak yakbi voni buli virizani abo vidavleni OuterGlowBitmapEffect dodaye kolorove syajvo navkolo vashogo vmistu Yaksho yakijs element upravlinnya ye aktivnim to mozhna zvernuti uvagu na cej efekt DropShadowBitmapEffect dodaye pryamokutnu tin sho za vashim elementom BitmapEffectGroup Zastosovuye kombinaciyu bitovih efektiv Poryadok vkazivki efektiv maye znachennya oskilki kozhnij zastosovuyetsya poverh isnuyuchih BitmapEf fectGroup vikoristovuyetsya ridko oskilki mnozhit nakladni vitrati Inakshe kazhuchi knopka iz chotirma efektami vimagaye vchetvero bilshe obrobki chim knopka z odnim efektom Perevagi ta osoblivosti trivimirnoyi grafikiPidtrimka trivimirnoyi grafiki odna z perlin platformi WPF Poperedni visokorivnevi nabori instrumentiv rozrobki taki yak Windows Forms vzagali obhodilisya bez pidtrimki 3 D zalishayuchi yiyi fanatam Direct Faktichno najbilshe vrazhaye v trivimirnih zasobah WPF prostota roboti z nimi Hocha mozhna stvoriti skladnij kod sho generuye i modifikuye trivimirni sitki iz zaluchennyam serjoznogo matematichnogo aparatu ale z tim zhe uspihom mozhna prosto eksportuvati trivimirni modeli z instrumentu proektuvannya j manipulyuvati nimi za dopomogoyu prostih transformacij Klyuchovi zasobi zabezpechuyutsya visokorivnevimi klasami sho ne vimagayut glibokih znan Popri te sho model trivimirnoyi grafiki WPF odrazu yasna j pogodzhena stvorennya bagatih trivimirnih interfejsiv zalishayetsya dosit skladnoyu zadacheyu Dlya togo shob vruchnu zakoduvati trivimirnu animaciyu abo navit prosto zrozumiti pokladeni v yiyi osnovu koncepciyi vam znadobitsya shos bilshe nizh trohi matematiki A modelyuvannya chogo nebud krim najtrivialnishih trivimirnih scen na osnovi vruchnu napisanogo kodu XAML ce velichezna robota nabagato bilshe skladna nizh dvovimirnij ekvivalent ruchnogo stvorennya vektornogo zobrazhennya XAML Iz ciyeyi prichini shvidshe za vse vam varto zvernutisya do instrumentiv vid nezalezhnih rozroblyuvachiv dlya stvorennya trivimirnih ob yektiv eksportuvati yih v XAML a potim dodavati do svoyih zastosunkiv Trivimirna grafika v WPF mistit u sobi taki ingrediyenti vikno pereglyadu viewport sho mistit vash trivimirnij vmist trivimirnij ob yekt dzherelo svitla sho visvitlyuye chastinu vashoyi trivimirnoyi sceni kamera sho predstavlyaye tochku z yakoyi vi sposterigayete trivimirnu scenu Zvichajno najskladnishi trivimirni sceni budut mistiti mnozhinu ob yektiv i mozhut vklyuchati mnozhinu dzherel svitla Mozhna takozh stvoriti trivimirnij ob yekt sho ne vimagaye dzherela svitla yaksho vin sam ye takim Odnak pererahovani ingrediyenti yavlyayut soboyu garnij pochatko Vikno pereglyadu mozhe mistiti v sobi bud yakij trivimirnij ob yekt uspadkovanij vid klasu Visual3D iz prostoru imen System Windows Media Media3D u yakomu perebuvaye perevazhna bilshist trivimirnih klasiv Shob pobuduvati trivimirnij ob yekt treba pochati z pobudovi geometriyi dlya ciyeyi meti isnuye tilki odin klas MeshGeometry3D Ne divno sho ob yekt MeshGeometry3D predstavlyaye sitku mesh Yaksho ranishe vi mali spravu iz trivimirnim malyuvannyam abo chitali sho nebud pro tehnologiyi pokladenih v osnovu suchasnih videokart to vzhe povinni znati sho komp yuteri voliyut buduvati trivimirni ob yekti iz trikutnikiv Ce poyasnyuyetsya tim sho trikutniki ce najprostishij najdokladnishij sposib opisu poverhni Trikutniki prosti tomu sho kozhnij z nih viznachayetsya vsogo troma tochkami vershinami v kutah Dugi j krivi poverhni virazno bilshe skladni Trikutniki dokladni tomu sho vsi inshi figuri iz pryamimi granyami kvadrati pryamokutniki j bilshe skladni bagatokutniki mozhut buti rozbiti na kolekciyi trikutnikiv Dobre ce abo pogano ale suchasne aparatne zabezpechennya grafiki i yiyi programuvannya buduyetsya na osnovi ciyeyi bazovoyi abstrakciyi Viznachivshi potribnu vlastivist MeshGeometry3D potribno pomistiti jogo v obolonku GeometryModel3D Klas GeometryModel3D maye tilki tri vlastivosti Geometry Material i BackMaterial Vlastivist Geometry prijmaye MeshGeometry3D sho viznachaye figuru vashogo trivimirnogo ob yekta Na dodatok mozhna zastosovuvati vlastivosti Material i BackMaterial dlya viznachennya poverhon z yakih skladayetsya vasha figura Poverhnya vazhliva cherez dvi prichini Po pershe vona viznachaye kolir ob yekta hocha mozhna vikoristovuvati j skladnishi kisti sho malyuyut teksturi zamist sucilnogo koloru Po druge vona viznachaye te yak material reaguye na svitlo WPF vklyuchaye chotiri klasi materialiv kozhnij z yakih uspadkovuyetsya vid abstraktnogo klasu Material iz prostoru imen System Windows Media Media3D Cimi materialami ye DiffuseMaterial stvoryuye plasku matovu poverhnyu sho rozpodilyaye svitlo rivnomirno u vsih napryamkah SpecularMaterial stvoryuye bliskuchu bezbarvnu poverhnyu tipu metalu abo skla Vidbivaye svitlo v protilezhnomu napryamku podibno dzerkalu EmissiveMaterial stvoryuye rozpechenu poverhnyu sho sama viprominyuye svitlo hocha ce svitlo ne vidbivayut inshi ob yekti sceni MaterialGroup dozvolyaye kombinuvati bilshe odnogo materialu Materiali sho kombinuyutsya nakladayutsya odin na odnogo v tim poryadku u yakomu dodavalisya do MaterialGroup Shob stvoriti realistichno pofarbovani trivimirni ob yekti WPF vikoristovuye model visvitlennya Osnovna ideya v tomu sho vi dodayete odin abo trohi dzherel svitla do trivimirnoyi sceni Harakter visvitlennya vashih ob yektiv zalezhit vid obranogo tipu dzherela svitla jogo polozhennya napryamku j intensivnosti Persh nizh porinuti u vivchennya visvitlennya WPF vazhlivo zrozumiti sho model visvitlennya WPF povoditsya ne tak yak svitlo v realnomu sviti Hocha sistema visvitlennya WPF i priznachena dlya togo shob emulyuvati realnij svit obchislennya pravilnogo vidbittya zadacha sho vimagaye serjoznih obchislyuvalnih resursiv WPF dopuskaye ryad sproshen sho garantuyut praktichnist modeli visvitlennya navit u vipadku animovanih trivimirnih scen z dekilkoma dzherelami svitla Do takih sproshen stavlyatsya pererahovani nizhche Svitlovi efekti obchislyuyutsya dlya ob yektiv individualno Svitlo vidbite vid odnogo ob yekta ne vidbivayetsya v inshomu ob yekti Analogichno ob yekt ne vidkidaye tini na inshij ob yekt nezalezhno vid jogo miscya roztashuvannya Osvitlenist obchislyuyetsya dlya vershin kozhnogo trikutnika a potim interpolyuyetsya po jogo poverhni Inshimi slovami WPF viznachaye intensivnist svitla v kozhnomu kuti a potim zgladzhuye jogo dlya zapovnennya vsogo trikutnika U rezultati takogo dizajnu ob yekti sho skladayutsya z vidnosno nevelikogo chisla trikutnikiv mozhut buti osvitleni nepravilno Shob zabezpechiti krashe visvitlennya vam nalezhit diliti vashi figuri na sotni abo navit tisyachu trikutnikiv Klasi dzherel svitla DirectionalLight Zapovnyuye scenu paralelnimi promenyami svitla sho jdut u zaznachenomu vami napryamku AmbientLight Napovnyuye scenu rozsiyanim svitlom PointLight Svitlo poshiryuyetsya v usi storoni iz tochkovogo dzherela SpotLight Svitlo poshiryuyetsya z odniyeyi krapki po konusi Persh nizh trivimirna scena bude vidobrazhena vam potribno roztashuvati kameru v korektnij poziciyi i oriyentuvati neyi v pravilnomu napryamku Ce robitsya ustanovkoyu u vlastivist Viewport3D Camera ob yekta Camera Vibir pravilnoyi kameri vidnosno prosta zadacha ale rozmishennya j konfiguruvannya yiyi trohi skladnishe Pershe sho potribno ce specifikuvati krapku v trivimirnomu prostori de bude pozicionovana kamera ustanovivshi znachennya yiyi vlastivosti Position Drugij krok ustanovka trivimirnogo vektora u vlastivosti LookDirection sho vkazuye oriyentaciyu kameri U tipovij trivimirnij sceni kamera rozmishayetsya ledve dali odnogo z kutiv sceni cherez vlastivist Position a potim nahilyayetsya dlya oderzhannya neobhidnogo vidu za dopomogoyu vlastivosti LookDirection Zvichajno ce lishe pershochergovij oglyad trivimirnih mozhlivostej Najprostishi prikladi 3D efektiv a tim pache oglyad visih konceptualnih mozhlivostej bez perebilshennya vihodit za ramki predstavlenogo materialu Aspekti versiyi WPF 4 0 u MicroSoft Visual Studio 201012 kvitnya u svit maye vijti MS Visual Studio 2010 she novishij doskonalishij ta funkcionalnishij instrument dlya rozrobki windows zastosunkiv v tomu chisli i za dopomogoyu platformi WPF U versiyi WPF4 mistitimutsya nastupni mozhlivosti WPF4 dodaye riznomanitni elementi keruvannya shob stvoryuvati biznes zastosunka she shvidshe j prostishe Novij nabir elementiv keruvannya vklyuchaye taki neobhidni elementi keruvannya yak DataGrid DatePicker i Calendar Windows 7 i element keruvannya Office Ribbon Vin pidtrimuye vsi standartni mozhlivosti z yakimi znajomij kincevij koristuvach zakladki j grupi dinamichna zmina rozmiriv panel shvidkogo dostupu menyu zastosunka zakladki sho zalezhat vid kontekstu garyachi klavishi j bagato chogo inshogo Keshovani zastosunki Velicheznij vigrash u produktivnosti dostupnij z novoyu mozhlivistyu WPF4 Cached Composition sho dozvolyaye zastosunkam keshuvati dovilnij vmist vklyuchayuchi zhivi i povnistyu interaktivni elementi keruvannya vektornu geometriyu rastrovi zobrazhennya sho zberigayutsya u videopam yati j t p Pomistivshi odin raz elementi v kesh voni mozhut buti dovilno peretvoreni animovani kerovani do nih mozhna zastosuvati Effects bez neobhidnosti peremalovuvati zakeshovani elementi Vse ce privodit do zberezhennya CPU i GPU vid peremalovuvannya vmistu j dozvolyaye GPU peremalovuvati pryamo z keshu Kesh rozumiye brudni oblasti tomu kursor sho blimaye u zakeshovanomu tekstovomu bloci napriklad povinen bude peremalyuvati tilki kursor mizh frejmami Z yavilasya navit nova kist sho vikoristovuye rozumnij kesh faktichno ce VisualBrush z polipshenoyu produktivnistyu Funkciyi dlya polegshennya animaciyi Diskretna linijna j splajnova animaciya vzhe pidtrimuyetsya poperednimi versiyami WPF WPF4 predstavlyaye novij koncept Easing Functions yaki dozvolyayut rozrobnikam stvoryuvati riznu animaciyu Napriklad pruzhinisti ruhi Funkciyi sproshennya Easing Functions viznachayut sposib animaciyi vid pochatku j do kincya Ubudovani funkciyi sproshennya nadayut spektr rezhimiv v animaciyi krugovoyi eksponentnoyi elastichnoyi j pruzhinistoyi Funkciyi sproshennya sproektovani legkorozshiryuvanimi dozvolyayuchi rozrobnikam stvoryuvati vlasni Zavdyaki danomu novovvedennyu dizajneri mozhut bez zusil stvoryuvati plavnu j organichnu animaciyu Novij stek dlya promalovuvannya tekstu WPF buv povnistyu zaminenim sho prizvelo do istotnih udoskonalen u chitkosti promalovuvannya tekstu zdatnosti do zmini nastroyuvan i pidtrimki mizhnarodnih mov Cej novij tekstovij stek pidtrimuye optimizovanij simvolnij shar shob pokazuvati tekst iz porivnyannoyu rizkistyu tekstu v Win32 GDI Tak samo novij stek pidtrimuye yavno obrani rezhimi promalovuvannya tekstu aliased grayscale ClearType Novij tekstovij stek dozvolyaye optimizuvati tekstovu priv yazku dlya animaciyi j statiki Do togo zh novij tekstovij stek pidtrimuye shrifti z ubudovanimi kartami zobrazhen sho dozvolyaye bagatom shidno azijskim shriftam promalovuvatis iz chitkistyu do yakoyi zvikli koristuvachi Win32 Vlasni slovniki WPF mistit u sobi perevirku orfografiyi sho do 4 yi versiyi vikoristovuvala slovniki nadavani OS Ce bulo velikoyu problemoyu dlya zastosunkiv yaki vikoristovuyut specifichnu terminologiyu dani zastosunki nabridali postijnimi povidomlennyami pro nepravilne napisannya WPF4 predstavlyaye API sho dozvolyaye zastosunkam dodavati slova v slovniki vikoristovuvani WPF dlya perevirki orfografiyi http blogs msdn com text archive 2009 10 02 custom dictionaries aspx 18 sichnya 2010 u Wayback Machine Windows 7 Pidtrimka multitach Z podannyam multitach uvedennya j pidtrimki manipulyuvannyam obrobki WPF4 nadaye vidminnij sposib dodati pikantnosti u vash kliyentskij zastosunok v Windows 7 Z yavilisya novi podiyi manipulyaciyi j inerciyi multitach podiyi Manipulation Inertia Pan Zoom Rotate nad UIElement prosti multitach podiyi Up Move Down nad UIElement UIElement3D i ContentElement zahoplennya dekilkoh elementiv keruvannya pidtrimka multitach v ScrollViewer rozshiryuvanist sensornih pristroyiv sumisnist iz Surface SDK u majbutnomu Integraciya c Windows 7 interfejsom WPF 4 nadaye novogo j klyuchovogo funkcionalu v Windows 7 dlya WPF rozroblyuvachiv Nova panel zadach zaharashena j mozhe peredavati bilshe informaciyi Aero piktogrami pidtrimuyut koristuvalnicki komandi Jump List zabezpechuye dostup do kontekstualnogo zapusku zadach i fajliv dlya zastosunku WPF 4 integruyetsya z funkcionalnistyu Windows 7 Jump List vklyuchayuchi zadachi elementi spisok nedavno vidkritih i chasto vikoristovuvanih elementiv vlasni kategoriyi Integraciya z panellyu zadach Windows 7 vklyuchayuchi indikator progresu ikonki nakladennya knopki z miniatyurami z pidtrimkoyu komand tekst opisu dlya miniatyur u menedzheri vikon V Windows 7 panel zadach bula povnistyu pereroblena dlya zmenshennya zaharashennya j polipshennya dopomogi koristuvachevi u vikonanni zadach u kilka klikiv WPF4 nadaye integraciyu z panellyu zadach Windows 7 v XAML dozvolyayuchi zastosunkam vivoditi korisnu informaciyu koristuvachevi cherez ikonki v paneli zadach vikoristovuyuchi ikonki nakladennya indikator progresu panel ikonok tekst opisu ikonok i miniatyur vikon u paneli zadach Tak samo z yavivsya novij klas TaskbarItemInfo sho rozshirenij yak vlastivist zalezhnostej Vin mistit u sobi vsi novi osoblivosti paneli zadach v Windows7 Nakladennya ikonki Nakladennya ikonki Icon Overlays dozvolyayut zastosunku vivoditi pevni povidomlennya j stan koristuvachevi cherez vlasnu knopku v paneli zadach vidobrazhayuchi nevelike nakladennya sho z yavlyayetsya v nizhnomu pravomu kuti knopki Indikator progresu Knopka v paneli zavdan mozhe buti vikoristana dlya vidobrazhennya prostoyi informaciyi pro progres ne zmushuvati koristuvacha zajvij raz vidkrivati vikno dlya pereglyadu stanu Indikator progresu mozhe buti vikoristanij dlya vidstezhennya procesu kopiyuvannya fajliv zavantazhennya instalyaciyi zapisu danih na disk abo inshoyi operaciyi sho zajmaye pevnij vidrizok chasu Novij rushij XAML BAML parsera V WPF 4 bula zaminena realizaciya XamlReader Load BAML zavantazhennya funkcionalnist Control amp DataTemplate novim rushiyem pobudovanim na osnovi novogo System Xaml dll Microsoft vipravila bagato pomilok i dodala bagato novih funkcionalnih polipshen Koristuvachi XamlReader Load mozhut skoristatisya dekilkoma novimi osoblivostyami movi v XAML2009 takimi yak pidtrimka generik tipiv MarkupExtensions i TypeConverters mozhut uzhe zaraz oderzhuvati dostup do bagatoh servisiv cherez stvorennya ob yektnogo grafa dozvolyayuchi vikonuvati bilshe scenariyiv yak dostup do Root ob yekta Bude she prostishe stvoriti instrumenti dlya analizu j manipulyuvannya XAML z novim nizkorivnevim API nadanim u System Xaml dll Div takozhMicrosoft Silverlight WPF E u minulomu Microsoft Expression StudioCya stattya potrebuye dodatkovih posilan na dzherela dlya polipshennya yiyi perevirnosti Bud laska dopomozhit udoskonaliti cyu stattyu dodavshi posilannya na nadijni avtoritetni dzherela Zvernitsya na storinku obgovorennya za poyasnennyami ta dopomozhit vipraviti nedoliki Material bez dzherel mozhe buti piddano sumnivu ta vilucheno traven 2015 Cyu stattyu treba vikifikuvati dlya vidpovidnosti standartam yakosti Vikipediyi Bud laska dopomozhit dodavannyam dorechnih vnutrishnih posilan abo vdoskonalennyam rozmitki statti traven 2015 Ce nezavershena stattya pro informacijni tehnologiyi Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi