#155 – Реализация Attached Dependency Property

Когда вы реализуете dependency property, которое будет использовано как присоединяемое свойство XAML, вы используете метод DependencyProperty.RegisterAttached, а не метод DependencyProperty.Register. Описание определения метода RegisterAttached аналогично Register, включая все параметры.

В примере ниже, когда мы регистрируем Person.AgeProperty, которое мы хотим использовать как присоединяемое свойство XAML.

Читать полностью »

14.12.2010

#154 – Переиспользование существующего Dependency Property в вашем классе

Как мы рассмотрели ранее как зарегистрировать новое dependency property в своем классе используя метод DependencyProperty.Register. Вы также можете переиспользовать существующее dependency property, используя метод DependencyProperty.AddOwner.

Когда вы переиспользуете существующее dependency property, вы можете опционально указать новые метаданные, которые будут применены для использования к dependency property в вашем новом типе. Вы также должны определить свойства CLR для нового типа, которые будут оборачивать вызовы GetValue/SetValue для чтения/записи значений dependency property.

Читать полностью »

13.12.2010

№146 – Использование метода GetValueSource для поиска источника значения Dependency Property

Зачастую полезно определить источник текущего значения dependency property. Вы можете использовать метод DependencyPropertyHelper.GetValueSource для этого.

В следующем примере получение значение источника свойства Foreground возможно из стиля или триггера определенного стилем определенного на основе значения свойства IsEnabled.

Читать полностью »

05.12.2010

№145 – Dependency Property Value Sources: №11 – значение по умолчанию

Одиннадцатый источник из списка источников базового значения для dependency property является значение по умолчанию. Dependency property может определять значение по умолчанию, которое устанавливает значение свойства, если не нашлось механизма с большим приоритетом для установки значения.

Например, обратите внимание, что значение свойства Opacity для большинства контролов унаследованных от UIElement (например, Button или Label) имеет значение 1.0, если вы не измените его на что-нибудь еще. Это значение по умолчанию для свойства UIElement.Opacity, указанное в его метаданных.

Читать полностью »

04.12.2010

№144 – Dependency Property Value Sources: №10 – наследование

Десятый источник в списке источников базового значения dependency property является наследование. Свойство может получить свое базовое значение через наследование, если вышестоящий элемент в логическом дереве устанавливает свойство и свойство не переопределено согласно более высокому приоритету.

Это значит, что когда вы устанавливаете значение свойства в XAML или в коде, то это значение зачастую "стекает вниз" по элементам дерева и применяется к другим элементам, которые имеют свойство с тем же именем.

Вот пример, где значение FontStyle для нескольких контролов наследуется от вышестоящего элемента Window.

Читать полностью »

02.12.2010

№143 – Dependency Property Value Sources: №9 – стиль темы

Девятый источник в списке источников базового значения dependency property является стиль определенный в теме. Свойство получает базовое значение из стиля темы, если сеттер для контрола определен в стиле по умолчанию. Каждый контрол поставляемый с WPF имеет стиль по умолчанию, который определяет внешний вид, который известен как стиль темы.

Если мы взглянем на стиль по умолчанию для контрола, мы увидим что стиль по умолчанию устанавливает свойство Background для ComboBox:

Читать полностью »

02.12.2010

№142 – Dependency Property Value Sources: №8 – триггер стиля темы

Восьмой источник в списке источников базового значения dependency property является триггер определенный в стиле темы. Триггером стиля темы является триггер определенный в стиле по умолчанию для контрола. Каждый контрол, который поставляется с WPF имеет стиль по умолчанию который определяет внешний вид, также известный как стиль темы.

В примере обратите внимание, что когда вы устанавливаете свойство IsEditable для ComboBox в true, то внешний вид меняется.

Читать полностью »

01.12.2010

№141 – Dependency Property Value Sources: №7 – сеттеры стилей

Седьмой источник в списке источников базового значения dependency property является сеттер стиля. Свойство получает свое значение из сеттера стиля, когда стиль применяется к родительскому элементу и значение свойства устанавливается с помощью использования Setter из применяемого стиля.

В примере ниже, кнопка имеет стиль redBlueTextButton. Стиль устанавливает свойство Foreground в красный цвет, используя Setter. Так же устанавливается синий цвет, когда вы проводите мышкой над контролом. Источником свойства Foreground является стиль (style setter) после применения и при срабатывании триггера стиля, когда мышка над контролом.

Читать полностью »

30.11.2010

№140 – Dependency Property Value Sources: №6 – триггеры шаблона

Шестой источник в списке источников базового значения dependency property является триггер из шаблона. Свойство получает свое значение из триггера шаблона, когда элемент, которому принадлежит свойство имеет шаблон с триггером, который изменяет значение.

В примере ниже, мы применили шаблон к главной кнопке, заменив ее двумя метками и новой кнопкой. триггер изменяет свойство Foreground оригинальной кнопки, таким образом источник свойства получает значение из триггера определенного в шаблоне.

Оригинальная кнопка замещается контролами из шаблона, но свойство Foreground сохранено используя расширение разметки TemplateBinding.

Читать полностью »

29.11.2010

№139 – Dependency Property Value Sources: №5 – триггеры стилей

Пятый источник в списке источников базового значения dependency property является триггер стиля. Свойство получает значение и стилевого триггера, когда стиль применяется к родительскому элементу и значение свойства меняется в результате срабатывания триггера.

В примере ниже, к кнопке применен стиль blueTextButton. Стиль устанавливает свойство Foreground синим цветом, когда курсор мыши находится над контролом. Источник свойства Foreground получает свое значение во время срабатывание триггера.

Читать полностью »

28.11.2010

№138 – Dependency Property Value Sources: №4 – неявный стиль

Четвертый источник в списке источников базового значения dependency property является неявный стиль. Это правило применяется только к dependency свойству Style.

Свойство Style пролучает значение неявно, когда стиль применяется ко всем элементам, чей тип совпадает с указанным целевым типом (TargetType) стиля.

Так как явный стиль рассматривается как локальное значение, то получается следующий список приоритетов для свойства Style от высшего к низшему:

Читать полностью »

27.11.2010

№137 – Значение свойства Style получается из одного из трех мест

Свойство Style одно из dependency property, которое не следует полному списку правил приоритетов значения свойств. Его значение может быть получено из одного из трех источников приведенных ниже.

  1. Explicit style - Стиль явно указан в XAML, как ресурс или указан в коде. Работает как локальное значение
  2. Implicit style - Стиль применяется ко всем элементам, чьи типы совпадают с целевым типом стиля
  3. Default - Нет указанного стиля, используется стиль по умолчанию

Вот пример explicit style.

Читать полностью »

26.11.2010

№136 – Dependency Property Value Sources: №3 – родительский шаблон

Третий источник в списке источников базового значения dependency property является родительский шаблон. Свойство получает свое значение из родительского шаблона, если элемент для которого устанавливается свойство создан как часть шаблона и не получил свое значение из триггера.

В примере ниже, шаблон excitedLabel имеет два контрола потомка Label. Один из них имеет свойство Background установленное из шаблона, таким образом источником является родительский шаблон.

Читать полностью »

25.11.2010

№135 – Dependency Property Value Sources: №2 – триггер в родительском шаблоне

Второй источник в списке источников базового значения dependency property это триггер в родительском шаблоне. Свойство получает значение из триггера родительского шаблона, если элемент часть шаблона и его значение устанавливается триггером, определенным в шаблоне.

В примере ниже, шаблон excitedLabel имеет два контрола потомка Label, чье свойство Background изменяется, когда вы проводите мышкой над родительским контролом. Когда это случается, то источник их свойства Background устанавливается триггером родительского шаблона.

Читать полностью »

24.11.2010

№134 – Dependency Property Value Sources: №1 – локальное значение

Наивысший приоритет источника для базового значения dependency property является локальное значение, установленное в XAML для элемента владельца свойства, или установленное из кода. Если локальное значение установлено, то оно заменит все остальные возможные источники базового значения для свойства.

В следующем примере, 2-й контрол Label предоставляет локальное значение для свойства FontStyle, перекрывая унаследованное значение.

Читать полностью »

23.11.2010

№133 – Где Dependency Property берет свое значение

Так как значение dependency property могут быть получено из различных источников, WPF использует заданный приоритет для каждого возможного источника значения свойства в целях определения окончательного значения.

WPF определяет конечное значение для dependency property следующим образом:

  • Определение базового значения, используя правила приоритета, перечисленных ниже
  • Вычисление выражения
  • Применение анимаций
  • Coerce значенеи (реализация класса может принудительно изменить валидное значение)
  • Валидация (реализация класса может выбросить исключение, если значение не валидное)

Читать полностью »

22.11.2010

№131 – Dependency Properties наследуют значения от вышестоящих в логическом дереве

Значение dependency property может быть получено из различных источников, но зачастую свойство наследуется от элемента расположенного выше в логическом дереве.

Имеется ввиду, что когда вы устанавливаете значение свойства в XAML или коде, то значенеи зачастую "стекает" по дереву элементов и применяется к другим элементам, которые имеют свойство с темже именем.

Вот пример. Значение FontStyle для нескольких контролов наследуется от вышестоящего элемента Window.

Читать полностью »

20.11.2010

№126 – Реагирование на изменение Dependency Property используя биндинг

Один из вариантов отреагировать на изменение значения в dependency property это привязка свойства одного контрола к свойству другого.

Идея связи в том, что исходный объект и свойство, откуда получаются данные и объект назначения со свойством куда данные привязываются друг к другу.

Это пример, в котором мы привязываем контент контрола Label к значению Slider.

Читать полностью »

15.11.2010

№123 – Coercing a Dependency Property

Класс который реализует зависимое свойство (dependency property), может также предоставлять метод обратного вызова для coercion, которое указывается при регистрации свойства. Coercion callback вызывается перед получением свойством нового значения и дает классу возможность принудительно изменить значение свойства на другое значение.

Вы укажите метод обратного вызова валидации при регистрации зависимого свойства, используя делегат CoerceValueCallback.

Читать полностью »

12.11.2010

№122 – Валидация Dependency Property

Класс, который реализует зависимые свойства (dependency property), может также предоставлять обратные вызовы для валидации (validation callback), которые указываются при регистрации свойства. Обратные вызовы валидации вызываются, когда свойство устанавливается в новое значение и возвращает true или false, указывая валидно ли новое значение.

Вы указываете обратный вызов валидации при регистрации зависимого свойства.

Читать полностью »

11.11.2010

#117 – Регистрация Dependency Property

Для реализации dependency property, класс должен создать одиночный статический экземпляра класса DependencyProperty. Этот экземпляр статический потому, что DependencyProperty только описывает dependency property, а не является местом для хранения фактического значения свойства.

Начните с определения статического поля для нового свойства.

Читать полностью »

06.11.2010

#29 – Зависимые свойства

DispatcherObject является базовым классом для классов, которые поддерживают свойства зависимостей.

Свойство зависимостей в WPF похоже на стандартное свойство CLR, но более мощное. Зависимость свойств:

  • Получить их значения от одного из нескольких различных источников
  • Поддержка наследования значений свойств
  • Поддержка уведомлений, при изменении значения свойства

Если класс является производным от DispatcherObject, значит что класс может зарегистрировать свои свойства зависимостей и вызывать методы, чтобы получить/установить значения его зависимых свойств.

Оригинал: #29 – Dependency Properties

10.08.2010