Wpf, визначення та реєстрація властивостей залежно

WPF --- Основа WPF --- Визначення та реєстрація властивостей залежно

Властивості залежності доводиться створювати набагато рідше, ніж використовувати. Проте, існує безліч причин, за якими вам доведеться створювати власні властивості залежності. Очевидно, вони будуть ключовим інгредієнтом при створенні користувальницького елемента WPF. Але вони знадобляться і тоді, коли необхідно додати прив'язку даних, анімацію або якусь іншу можливість WPF у фрагмент коду, який інакше не зміг би підтримувати їх. Створити властивість залежності не дуже складно, хоча до синтаксису потрібно звикнути. Він повністю відрізняється від синтаксису звичайного властивості .NET.

Властивості залежності можна додавати тільки до об'єктів залежно - класами, породжених від DependencyObject. На щастя, більшість ключових компонентів інфраструктури WPF побічно породжені від DependencyObject. Найбільш очевидним прикладом такого породження є елементи.

Спочатку потрібно визначити об'єкт, який буде представляти властивість. Це екземпляр класу DependencyProperty. Інформація про властивості повинна бути доступна постійно і, можливо, навіть інших класів (як зазвичай для елементів WPF). З цієї причини об'єкт DependencyProperty слід визначити як статичне поле в пов'язаному класі.

Наприклад, клас FrameworkElement визначає властивість Margin, доступне всім елементам. Звичайно, Margin - це властивість залежності. Це означає, що воно визначається в класі FrameworkElement наступним чином:

Прийнято угоду, що поле, яке представляє властивість залежності, має ім'я звичайного властивості з додаванням слова Property в кінці. Таким чином можна відокремити визначення властивості залежності від імені самого властивості. Поле визначено з ключовим словом readonly - це означає, що його значення можна задати тільки в статичному конструкторі для класу FrameworkElement, але це вже наступний крок.

Реєстрація властивості залежно

Визначення об'єкта DependencyProperty є лише першим кроком. Щоб його можна було задіяти, необхідно зареєструвати властивість залежності в WPF. Це потрібно зробити до використання даного властивості в коді, тому визначення повинно бути виконано в статичному конструкторі пов'язаного класу.

WPF гарантує, що об'єкти DependencyProperty створено не буде, безпосередньо, так як клас DependencyProperty не має загальнодоступного конструктора. Примірник DependencyProperty може бути створений тільки за допомогою статичного методу DependencyProperty.Register (). WPF також гарантує неможливість зміни об'єктів DependencyProperty після їх створення, тому що всі члени DependencyProperty доступні тільки для читання, а їх значення повинні бути задані у вигляді аргументів на методі Register ().

У наступному фрагменті коду наведено приклад створення DependencyProperty. Тут клас FrameworkElement використовує статичний конструктор для ініціалізації MarginProperty:

Реєстрація властивості залежно здійснюється в два етапи. Спочатку створюється об'єкт FrameworkPropertyMetadata, який вказує, які служби ви хочете використовувати з властивістю залежності (наприклад, підтримку прив'язки даних, анімацію та ведення журналу). Потім властивість реєструється, для чого викликається метод DependencyProperty.Register (). Тут потрібно визначити кілька ключових інгредієнтів:

ім'я властивості (в даному прикладі це Margin);

тип даних, використовуваний властивістю (в даному прикладі це структура Thickness);

тип, якому належить ця властивість (в даному прикладі це клас FrameworkElement);

об'єкт FrameworkPropertyMetadata з додатковими параметрами властивості (необов'язково);

зворотний виклик, при якому проводиться перевірка правильності властивості (необов'язково).

З першими трьома інгредієнтами все начебто ясно. Більш цікавими є об'єкт FrameworkPropertyMetadata і зворотний виклик перевірки.

Об'єкт FrameworkPropertyMetadata використовується для налаштування додаткових можливостей створюваного властивості залежності. Велика частина властивостей класу FrameworkPropertyMetadata є звичайні логічні прапори, які встановлюються для активації цих можливостей (за замовчуванням всі ці прапори мають значення false). Але деякі з них є зворотними викликами, які вказують на призначені для користувача методи, створені для виконання конкретних завдань. Одне з таких властивостей - FrameworkPropertyMetadata.DefaultValue - встановлює стандартне значення, яке WPF буде застосовувати при початковій ініціалізації властивості. Нижче наведені всі властивості FrameworkPropertyMetadata:

Властивості класу FrameworkPropertyMetadata

AffectsArrange, AffectsMeasure, AffectsParentArrange, AffectsParentMeasure

Якщо має значення true, то властивість залежності може впливати на розташування суміжних елементів (або батьківського елемента) під час етапу вимірювання і етапу розстановки в операції компонування. Наприклад, властивість залежно Margin заносить в AffectsMeasure значення true - це означає, що при зміні полів елементів контейнер компонування повинен повторити етап вимірювання, щоб визначити нове розміщення елементів

Якщо має значення true, то властивість залежності може впливати на зовнішній вигляд елемента, що вимагає перемальовування елемента

Якщо має значення true, то властивість залежності буде використовувати не односторонню (за замовчуванням), а двосторонню прив'язку даних. Однак при створенні прив'язки можна явно вказати її поведінку

Якщо має значення true, то значення властивості залежно поширюється по дереву елементів і може успадковуватися вкладеними елементами. Наприклад, успадковані властивістю залежності є Font: якщо вказати його для елемента найвищого рівня, то воно успадковується вкладеними елементами, якщо не буде явно перекрито власними параметрами шрифту

Якщо має значення true, то властивість залежності можна використовувати в анімації

Якщо має значення true, то значення властивості залежно можна встановлювати в вираженні прив'язки

Якщо має значення true, то в сторінковому додатку значення властивості залежно буде збережено в журналі (історія відвіданих сторінок)

Якщо має значення true, то WPF не виконуватиме перерисовку об'єкта при зміні одного з його подсвойств (характеристики якості)

Встановлює стандартне значення для властивості Binding.UpdateSourceTrigger, коли ця властивість використовується в вираженні прив'язки. Властивість UpdateSourceTrigger визначає момент застосування змін прив'язаного значення. Властивість UpdateSourceTrigger можна встановити вручну при створенні прив'язки

Встановлює стандартне значення для властивості залежно

Забезпечує зворотний виклик, який намагається "виправити" значення властивості перед його перевіркою