Ресурси WPF
Найперше місце, де програміст стикається з необхідністю відокремити відображення від самих даних – це ресурси. У кожного елемента є влас ність Resources, що є звичайним словником2, який дозволяє шукати значення по ключу. Ця проста техніка застосовується в механізмах підтримки тем, стилізації та прив'язки до даних.
У програмі мовою C# можна визначати змінні для подальшого використання. Часто це робиться задля зручності читання коду, а іноді з метою усуспільнення:
public class Window1 : Window
Brush toShare = новий SolidColorBrush(Colors.Yellow);
Button b = New Button (); b.Content = "My Button"; b.Background = toShare;
У розмітці ця проблема не така проста. Модель граматичного аналізу XAML
вимагає, щоб усі створювані об'єкти були властивостями чогось. Захоч ми по
Мал. 6.1. Перевизначення ресурсів в ієрархії елементів
Зважаючи на композицію елементів, ми хотіли б, щоб пошук проводився з урахуванням ієрархії. Якщо безпосередній батько елемента не містить певну змінну, то треба переглядати наступного батька і т.д.
У цьому прикладі ми перевизначаємо той самий ресурс на кількох рівнях дерева елементів. Спочатку значення toShare визначається в кореневому елементі Windows, так само, як і раніше. Потім воно заміщається у вкладеній панелі StackPanel, де створюється ресурс з таким самим ім'ям. Різні кнопки можуть посилатися на ресурс з ім'ям toShare і отримувати різні значення в залежності від того, де дерева знаходяться (рис. 6.1):
1. Ієрархія елементів.
4. Системна тема.
У розділі 2 ми розглядали об'єкт Application. У нього також є властивість
Resources, що дозволяє визначити ресурси, глобальні длявсього додатку:
Ця техніка дозволяє створювати ресурси, загальні для всіх сторінок, вікон та елементів управління На будь-якому рівні програми можна перевизначити глобальне значення ресурсу; як це робиться, ми вже бачили. У загальному випадку рекомендується визначати ресурс на найнижчому можливому рівні. Якщо якийсь ресурс використовується тільки в одній панелі, то для цієї панелі його і треба визначити. Якщо ж ресурс використовується в декількох вікнах, то визначити його слід на рівні програми. Визначаючи ресурс, важливо пам'ятати, що використовувати його можна у різних місцях. Оскільки кожен елемент WPF може бути присутнім тільки в одному місці дерева відображення, ми не можемо надійно використовувати елемент як ресурс:
У розділі 3 ми дізналися про те, що робити, коли ресурс потрібно використовувати більше одного разу, - вдатися до класу FrameworkElementFactory. Для елементів, що належать шаблонам, ми створюємо фабрику, а не самі елементи. Більшість візуальних об'єктів (кистей, пір'я, сіток і т.д.) фабрика не потрібна, оскільки багаторазове використання забезпечується успадкуванням класу Freezable3.
Можливо, ви ставите питанням: «З чого раптом він завів про ресурси в розділі, присвяченій прив'язці до даних?» Справа в тому, що, використовуючи посилання на статичні ресурси, ми по суті виконуємо привласнення змінної, як у наведеному вище фрагменті C#. Коли ця змінна використовується, жодного зв'язку з вихідною змінною вже немає. Розглянемо наступний код:
Brush someBrush = Brushes.Red; Button button1 = New Button(); button1.Background = someBrush; someBrush = Brushes.Yellow;
// button1.Background тут буде червоним
При роботі з ресурсами можна або виконати аналогічний статичний зв'язок
кликання у форміпривласнення, або організувати динамічне зв'язування:
Оскільки цього разу ми скористалися динамічним зв'язуванням, то можемо змінити колір кнопки, надавши нове значення властивості Resources вікна:
3 Об'єкти класу Freezable підтримують узагальнення завдяки режиму «заморозки», в якому вони не можуть бути змінені. Режим заморозки дає можливість кільком об'єктам користуватися одним і тим самим екземпляром, не думаючи про те, чи він був змінений кимось іншим.
Це дуже корисний механізм. У поєднанні з ієрархічною областю видимості ресурсів він дозволяє оновити відразу всі вікна або сторінки програми. Щоб виконати динамічне зв'язування ресурсу програмно, нам знадобиться метод FrameworkElement.SetResourceReference:
Звичайно, такі динамічні посилання не обходяться без витрат, оскільки система повинна відстежувати зміни ресурсу. При проектуванні моделі ресурсів ми прагнули створити такий механізм, який міг би широко використовуватися в системі виявлення ресурсів, не викликаючи серйозного падіння продуктивності. Тому ресурси оптимізовані для великих змін.
При зміні будь-якого ресурсу оновлюється дерево. Тому статичні та динамічні посилання на ресурси можна використовувати в багатьох місцях, вартість операції від кількості посилань не залежить. А ось часто змінювати ресурси для оновлення інтерфейсу користувача не варто. Натомість і турбуватися з приводу великої кількості посилань на ресурси не треба.
Ресурси – це особлива форма прив'язки до даних, оптимізована з розрахунку на велику кількість прив'язок, які рідко оновлюються. У загальному випадку, механізм прив'язки до даних оптимізований у припущенні помірної кількості прив'язок (у тому числі і двосторонніх) з високоючастотою поновлення. Цей більш загальний вигляд прив'язки отримав і простішу назву; у WPF він називається простозв'язуваннямабоприв'язкою.
Джерело: К. Андерсон Основи Windows Presentation Foundation. Пров. з англ. А. Слінкіна - М.: ДМК Прес, 2008 - 432 с.: Іл.